home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / jikes / src / expr.cpp < prev    next >
C/C++ Source or Header  |  1999-05-14  |  293KB  |  6,731 lines

  1. // $Id: expr.cpp,v 1.15 1999/03/09 14:37:16 shields Exp $
  2. //
  3. // This software is subject to the terms of the IBM Jikes Compiler
  4. // License Agreement available at the following URL:
  5. // http://www.ibm.com/research/jikes.
  6. // Copyright (C) 1996, 1998, International Business Machines Corporation
  7. // and others.  All Rights Reserved.
  8. // You must accept the terms of that agreement to use this software.
  9. //
  10. #include "double.h"
  11. #include "config.h"
  12. #include <assert.h>
  13. #include <stdio.h>
  14. #include <math.h>
  15. #include <sys/stat.h>
  16. #include "parser.h"
  17. #include "semantic.h"
  18. #include "control.h"
  19. #include "table.h"
  20. #include "tuple.h"
  21. #include "spell.h"
  22.  
  23. inline bool Semantic::IsIntValueRepresentableInType(AstExpression *expr, TypeSymbol *type)
  24. {
  25.     IntLiteralValue *literal = (IntLiteralValue *) expr -> value;
  26.  
  27.     return (expr -> IsConstant() && 
  28. //
  29. // TODO: this test makes more sense than the one below. However, the JLS
  30. // specifies the "IsInt" test below?
  31. //control.IsSimpleIntegerValueType(expr -> type())) &&
  32. //
  33.            expr -> Type() == control.int_type) &&
  34.            (type == control.int_type ||
  35.             type == control.no_type  ||
  36.             (type == control.char_type && (literal -> value >= 0)  && (literal -> value <= 65535)) ||
  37.             (type == control.byte_type && (literal -> value >= -128) && (literal -> value <= 127)) ||
  38.             (type == control.short_type && (literal -> value >= -32768)  && (literal -> value <= 32767)));
  39. }
  40.  
  41.  
  42. inline bool Semantic::MoreSpecific(MethodSymbol *source_method, MethodSymbol *target_method)
  43. {
  44.     if (! CanMethodInvocationConvert(target_method -> containing_type, source_method -> containing_type))
  45.         return false;
  46.  
  47.     for (int k = target_method -> NumFormalParameters() - 1; k >= 0; k--)
  48.     {
  49.         if (! CanMethodInvocationConvert(target_method -> FormalParameter(k) -> Type(),
  50.                                          source_method -> FormalParameter(k) -> Type()))
  51.             return false;
  52.     }
  53.  
  54.     return true;
  55. }
  56.  
  57.  
  58. inline bool Semantic::MoreSpecific(MethodSymbol *method, Tuple<MethodSymbol *> &maximally_specific_method)
  59. {
  60.     for (int i = 0; i < maximally_specific_method.Length(); i++)
  61.     {
  62.         if (! MoreSpecific(method, maximally_specific_method[i]))
  63.             return false;
  64.     }
  65.  
  66.     return true;
  67. }
  68.  
  69.  
  70. inline bool Semantic::NoMethodMoreSpecific(Tuple<MethodSymbol *> &maximally_specific_method, MethodSymbol *method)
  71. {
  72.     for (int i = 0; i < maximally_specific_method.Length(); i++)
  73.     {
  74.         if (MoreSpecific(maximally_specific_method[i], method))
  75.             return false;
  76.     }
  77.  
  78.     return true;
  79. }
  80.  
  81.  
  82. void Semantic::ReportMethodNotFound(Ast *ast, wchar_t *name)
  83. {
  84.     SemanticError::SemanticErrorKind kind;
  85.  
  86.     int num_arguments;
  87.     AstExpression **argument;
  88.  
  89.     AstMethodInvocation *method_call;
  90.     AstClassInstanceCreationExpression *class_creation;
  91.     AstThisCall *this_call;
  92.     AstSuperCall *super_call;
  93.     if (method_call = ast -> MethodInvocationCast())
  94.     {
  95.         kind = SemanticError::METHOD_NOT_FOUND;
  96.         num_arguments = method_call -> NumArguments();
  97.         argument = new AstExpression*[num_arguments + 1];
  98.         for (int i = 0; i < num_arguments; i++)
  99.             argument[i] = method_call -> Argument(i);
  100.     }
  101.     else
  102.     {
  103.         kind = SemanticError::CONSTRUCTOR_NOT_FOUND;
  104.  
  105.         if (class_creation = ast -> ClassInstanceCreationExpressionCast())
  106.         {
  107.             num_arguments = class_creation -> NumArguments();
  108.             argument = new AstExpression*[num_arguments + 1];
  109.             for (int i = 0; i < num_arguments; i++)
  110.                 argument[i] = class_creation -> Argument(i);
  111.         }
  112.         else if (super_call = ast -> SuperCallCast())
  113.         {
  114.             num_arguments = super_call -> NumArguments();
  115.             argument = new AstExpression*[num_arguments + 1];
  116.             for (int i = 0; i < num_arguments; i++)
  117.                 argument[i] = super_call -> Argument(i);
  118.         }
  119.         else
  120.         {
  121.             this_call = ast -> ThisCallCast();
  122. assert(this_call);
  123.             num_arguments = this_call -> NumArguments();
  124.             argument = new AstExpression*[num_arguments + 1];
  125.             for (int i = 0; i < num_arguments; i++)
  126.                 argument[i] = this_call -> Argument(i);
  127.         }
  128.     }
  129.  
  130.     int length = wcslen(name);
  131.  
  132.     for (int i = 0; i < num_arguments; i++)
  133.     {
  134.         TypeSymbol *arg_type = argument[i] -> Type();
  135.         length += arg_type -> ContainingPackage() -> PackageNameLength() +
  136.                   arg_type -> ExternalNameLength() + 3; // '/' after package_name
  137.                                                         // ',' and ' ' to separate this formal parameter from the next one
  138.     }
  139.  
  140.     wchar_t *header = new wchar_t[length + 3]; // +1 for (, +1 for ), +1 for '\0'
  141.     wchar_t *s = header;
  142.  
  143.     for (wchar_t *s2 = name; *s2; s2++)
  144.          *s++ = *s2;
  145.     *s++ = U_LEFT_PARENTHESIS;
  146.     if (num_arguments > 0)
  147.     {
  148.         for (int i = 0; i < num_arguments; i++)
  149.         {
  150.             TypeSymbol *arg_type = argument[i] -> Type();
  151.  
  152.             PackageSymbol *package = arg_type -> ContainingPackage();
  153.             wchar_t *package_name = package -> PackageName();
  154.             if (package -> PackageNameLength() > 0 && wcscmp(package_name, StringConstant::US__DO_) != 0)
  155.             {
  156.                 while (*package_name)
  157.                 {
  158.                     *s++ = (*package_name == U_SLASH ? (wchar_t) U_DOT : *package_name);
  159.                     package_name++;
  160.                 }
  161.                 *s++ = U_DOT;
  162.             }
  163.  
  164.             for (wchar_t *s2 = arg_type -> ExternalName(); *s2; s2++)
  165.                 *s++ = (*s2 == U_DOLLAR ? (wchar_t) U_DOT : *s2);
  166.             *s++ = U_COMMA;
  167.             *s++ = U_SPACE;
  168.         }
  169.  
  170.         s -= 2; // remove the last ',' and ' '
  171.     }
  172.     *s++ = U_RIGHT_PARENTHESIS;
  173.     *s = U_NULL;
  174.  
  175.     ReportSemError(kind,
  176.                    ast -> LeftToken(),
  177.                    ast -> RightToken(),
  178.                    header);
  179.  
  180.     delete [] header;
  181.     delete [] argument;
  182.  
  183.     return;
  184. }
  185.  
  186.  
  187. MethodSymbol *Semantic::FindConstructor(TypeSymbol *containing_type, Ast *ast,
  188.                                         LexStream::TokenIndex left_tok, LexStream::TokenIndex right_tok)
  189. {
  190.     Tuple<MethodSymbol *> constructor_set(2);
  191.  
  192.     int num_arguments;
  193.     AstExpression **argument; 
  194.  
  195.     AstClassInstanceCreationExpression *class_creation;
  196.     AstThisCall *this_call;
  197.     AstSuperCall *super_call;
  198.     if (class_creation = ast -> ClassInstanceCreationExpressionCast())
  199.     {
  200.         num_arguments = class_creation -> NumArguments();
  201.         argument = new AstExpression*[num_arguments + 1];
  202.         for (int i = 0; i < num_arguments; i++)
  203.             argument[i] = class_creation -> Argument(i);
  204.     }
  205.     else if (super_call = ast -> SuperCallCast())
  206.     {
  207.         num_arguments = super_call -> NumArguments();
  208.         argument = new AstExpression*[num_arguments + 1];
  209.         for (int i = 0; i < num_arguments; i++)
  210.             argument[i] = super_call -> Argument(i);
  211.     }
  212.     else
  213.     {
  214.         this_call = ast -> ThisCallCast();
  215. assert(this_call);
  216.         num_arguments = this_call -> NumArguments();
  217.         argument = new AstExpression*[num_arguments + 1];
  218.         for (int i = 0; i < num_arguments; i++)
  219.             argument[i] = this_call -> Argument(i);
  220.     }
  221.  
  222. assert(containing_type -> ConstructorMembersProcessed());
  223.  
  224.     for (MethodSymbol *constructor = containing_type -> FindConstructorSymbol();
  225.          constructor; constructor = constructor -> next_method)
  226.     {
  227.         if (! constructor -> IsTyped())
  228.             constructor -> ProcessMethodSignature((Semantic *) this, right_tok);
  229.  
  230.         if (num_arguments == constructor -> NumFormalParameters())
  231.         {
  232.             int i;
  233.             for (i = 0; i < num_arguments; i++)
  234.             {
  235.                 if (! CanMethodInvocationConvert(constructor -> FormalParameter(i) -> Type(), argument[i] -> Type()))
  236.                     break;
  237.             }
  238.             if (i == num_arguments)
  239.             {
  240.                 if (MoreSpecific(constructor, constructor_set))
  241.                 {
  242.                     constructor_set.Reset();
  243.                     constructor_set.Next() = constructor;
  244.                 }
  245.                 else if (NoMethodMoreSpecific(constructor_set, constructor))
  246.                     constructor_set.Next() = constructor;
  247.             }
  248.         }
  249.     }
  250.  
  251.     if (constructor_set.Length() == 0)
  252.     {
  253.         MethodSymbol *method;
  254.         for (method = containing_type -> FindMethodSymbol(containing_type -> Identity()); method; method = method -> next_method)
  255.         {
  256.             if (! method -> IsTyped())
  257.                 method -> ProcessMethodSignature((Semantic *) this, right_tok);
  258.  
  259.             if (num_arguments == method -> NumFormalParameters())
  260.             {
  261.                 int i;
  262.                 for (i = 0; i < num_arguments; i++)
  263.                 {
  264.                     if (! CanMethodInvocationConvert(method -> FormalParameter(i) -> Type(), argument[i] -> Type()))
  265.                         break;
  266.                 }
  267.                 if (i == num_arguments)
  268.                     break;
  269.             }
  270.         }
  271.  
  272.         if (method)
  273.         {
  274.             if (method -> method_or_constructor_declaration)
  275.             {
  276.                 AstMethodDeclaration *method_declaration = (AstMethodDeclaration *) method -> method_or_constructor_declaration;
  277.                 FileLocation loc(method -> containing_type -> semantic_environment -> sem -> lex_stream,
  278.                                  method_declaration -> method_declarator -> identifier_token);
  279.  
  280.                 ReportSemError(SemanticError::METHOD_FOUND_FOR_CONSTRUCTOR,
  281.                                left_tok,
  282.                                right_tok,
  283.                                containing_type -> Name(),
  284.                                loc.location);
  285.             }
  286.             else
  287.             {
  288.                 ReportSemError(SemanticError::METHOD_FOUND_FOR_CONSTRUCTOR,
  289.                                left_tok,
  290.                                right_tok,
  291.                                containing_type -> Name(),
  292.                                method -> containing_type -> file_location -> location);
  293.             }
  294.         }
  295.         else ReportMethodNotFound(ast, containing_type -> Name());
  296.  
  297.         delete [] argument;
  298.  
  299.         return (MethodSymbol *) NULL;
  300.     }
  301.     else if (constructor_set.Length() > 1)
  302.     {
  303.         ReportSemError(SemanticError::AMBIGUOUS_CONSTRUCTOR_INVOCATION,
  304.                        left_tok,
  305.                        right_tok,
  306.                        containing_type -> Name());
  307.     }
  308.  
  309.     delete [] argument;
  310.  
  311.     return constructor_set[0];
  312. }
  313.  
  314.  
  315. //
  316. //
  317. //
  318. VariableSymbol *Semantic::FindMisspelledVariableName(TypeSymbol *type, LexStream::TokenIndex identifier_token)
  319. {
  320.     VariableSymbol *misspelled_variable = NULL;
  321.     int index = 0;
  322.     NameSymbol *name_symbol = (NameSymbol *) lex_stream -> NameSymbol(identifier_token);
  323.  
  324.     for (int k = 0; k < type -> expanded_field_table -> symbol_pool.Length(); k++)
  325.     {
  326.         VariableShadowSymbol *variable_shadow = type -> expanded_field_table -> symbol_pool[k];
  327.         VariableSymbol *variable = variable_shadow -> variable_symbol;
  328.         if (! variable -> IsTyped())
  329.             variable -> ProcessVariableSignature((Semantic *) this, identifier_token);
  330.  
  331.         int new_index = Spell::Index(name_symbol -> Name(), variable -> Name());
  332.         if (new_index > index)
  333.         {
  334.             misspelled_variable = variable;
  335.             index = new_index;
  336.         }
  337.     }
  338.  
  339.     int length = name_symbol -> NameLength();
  340.  
  341.     return ((length == 3 && index >= 5) || (length == 4 && index >= 6) || (length >= 5 && index >= 7)
  342.                           ? misspelled_variable
  343.                           : NULL);
  344. }
  345.  
  346. //
  347. //
  348. //
  349. MethodSymbol *Semantic::FindMisspelledMethodName(TypeSymbol *type, AstMethodInvocation *method_call, NameSymbol *name_symbol)
  350. {
  351.     MethodSymbol *misspelled_method = NULL;
  352.     int index = 0;
  353.     AstSimpleName *simple_name = method_call -> method -> SimpleNameCast();
  354.     AstFieldAccess *field_access = method_call -> method -> FieldAccessCast();
  355.     LexStream::TokenIndex identifier_token = (simple_name ? simple_name -> identifier_token : field_access -> identifier_token);
  356.  
  357.     for (int k = 0; k < type -> expanded_method_table -> symbol_pool.Length(); k++)
  358.     {
  359.         MethodShadowSymbol *method_shadow = type -> expanded_method_table -> symbol_pool[k];
  360.         MethodSymbol *method = method_shadow -> method_symbol;
  361.         TypeSymbol *containing_type = method -> containing_type;
  362.  
  363.         if (! method -> IsTyped())
  364.             method -> ProcessMethodSignature((Semantic *) this, identifier_token);
  365.  
  366.         if (method_call -> NumArguments() == method -> NumFormalParameters())
  367.         {
  368.             int i;
  369.             for (i = 0; i < method_call -> NumArguments(); i++)
  370.             {
  371.                 AstExpression *expr =  method_call -> Argument(i);
  372.                 if (! CanMethodInvocationConvert(method -> FormalParameter(i) -> Type(), expr -> Type()))
  373.                     break;
  374.             }
  375.             if (i == method_call -> NumArguments())
  376.             {
  377.                 int new_index = Spell::Index(name_symbol -> Name(), method -> Name());
  378.                 if (new_index > index)
  379.                 {
  380.                     misspelled_method = method;
  381.                     index = new_index;
  382.                 }
  383.             }
  384.         }
  385.     }
  386.  
  387.     int length = name_symbol -> NameLength(),
  388.          num_args = method_call -> NumArguments();
  389.  
  390.     //
  391.     // If we have a name of length 2, accept >= 30% probality if the function takes at least one argument
  392.     // If we have a name of length 3, accept >= 50% probality if the function takes at least one argument
  393.     // Otherwise, if the length of the name is > 3, accept >= 60% probability.
  394.     //
  395.     return (index < 3 ? NULL
  396.                       : (length == 2 && (index >= 3 || num_args > 0)) ||
  397.                         (length == 3 && (index >= 5 || num_args > 0)) ||
  398.                         (length  > 3 && (index >= 6 || (index >= 5 && num_args > 0)))
  399.                                      ? misspelled_method
  400.                                      : NULL);
  401. }
  402.  
  403. //
  404. // Search the type in question for a method. Note that name_symbol is an optional argument.
  405. // If it was not passed to this function then its default value is NULL (see semantic.h) and
  406. // we assume that the name to search for is the name specified in the field_access of the
  407. // method_call. 
  408. //
  409. MethodSymbol *Semantic::FindMethodInType(TypeSymbol *type, AstMethodInvocation *method_call, NameSymbol *name_symbol)
  410. {
  411.     Tuple<MethodSymbol *> method_set(2);
  412.     AstFieldAccess *field_access = method_call -> method -> FieldAccessCast();
  413.     if (! name_symbol)
  414.         name_symbol = (NameSymbol *) lex_stream -> NameSymbol(field_access -> identifier_token);
  415.  
  416.     if (! type -> expanded_method_table)
  417.         ComputeMethodsClosure(type, field_access -> identifier_token);
  418.  
  419. //
  420. // TODO: Confirm that this is no longer the case as of javac 1.2
  421. //
  422. /*
  423.     //
  424.     // First look for the method in the "type". If it is not found, look for
  425.     // it in the superclasses in the proper order. It is possible that the
  426.     // method in question is a private field that is contained in the body
  427.     // of the type that we are currently processing (this_type()), in which
  428.     // case it is accessible even though it is not directly inherited by "type".
  429.     //
  430.     for (TypeSymbol *type_symbol = type; type_symbol && method_set.Length() == 0; type_symbol = type_symbol -> super)
  431.     {
  432. */
  433.         TypeSymbol *type_symbol = type;
  434.  
  435.         for (MethodShadowSymbol *method_shadow = type_symbol -> expanded_method_table -> FindMethodShadowSymbol(name_symbol);
  436.              method_shadow; method_shadow = method_shadow -> next_method)
  437.         {
  438.             MethodSymbol *method = method_shadow -> method_symbol;
  439.             TypeSymbol *containing_type = method -> containing_type;
  440.  
  441.             if (! method -> IsTyped())
  442.                 method -> ProcessMethodSignature((Semantic *) this, field_access -> identifier_token);
  443.  
  444.             if (method_call -> NumArguments() == method -> NumFormalParameters())
  445.             {
  446.                 int i;
  447.                 for (i = 0; i < method_call -> NumArguments(); i++)
  448.                 {
  449.                     AstExpression *expr =  method_call -> Argument(i);
  450.                     if (! CanMethodInvocationConvert(method -> FormalParameter(i) -> Type(), expr -> Type()))
  451.                         break;
  452.                 }
  453.                 if (i == method_call -> NumArguments())
  454.                 {
  455.                     if (MoreSpecific(method, method_set))
  456.                     {
  457.                         method_set.Reset();
  458.                         method_set.Next() = method;
  459.                     }
  460.                     else if (NoMethodMoreSpecific(method_set, method))
  461.                         method_set.Next() = method;
  462.                 }
  463.             }
  464.         }
  465.  
  466. /*
  467. See comment above...
  468.     }
  469. */
  470.  
  471.     if (method_set.Length() == 0)
  472.     {
  473.         if (! type -> expanded_field_table)
  474.             ComputeFieldsClosure(type, field_access -> identifier_token);
  475.  
  476.         VariableShadowSymbol *variable_shadow_symbol = type -> expanded_field_table -> FindVariableShadowSymbol(name_symbol);
  477.  
  478.         if (variable_shadow_symbol)
  479.         {
  480.             VariableSymbol *variable_symbol = variable_shadow_symbol -> variable_symbol;
  481.             TypeSymbol *enclosing_type = variable_symbol -> owner -> TypeCast();
  482. assert(enclosing_type);
  483.             ReportSemError(SemanticError::FIELD_NOT_METHOD,
  484.                            method_call -> LeftToken(),
  485.                            method_call -> RightToken(),
  486.                            variable_symbol -> Name(),
  487.                            enclosing_type -> ContainingPackage() -> PackageName(),
  488.                            enclosing_type -> ExternalName());
  489.         }
  490.         else
  491.         {
  492.             TypeSymbol *super_type;
  493.             MethodShadowSymbol *method_shadow;
  494.  
  495.             for (super_type = type -> super; super_type; super_type = super_type -> super)
  496.             {
  497.                 for (method_shadow = super_type -> expanded_method_table -> FindMethodShadowSymbol(name_symbol);
  498.                      method_shadow; method_shadow = method_shadow -> next_method)
  499.                 {
  500.                     MethodSymbol *method = method_shadow -> method_symbol;
  501.                     if (! method -> IsTyped())
  502.                         method -> ProcessMethodSignature((Semantic *) this, field_access -> identifier_token);
  503.  
  504.                     if (method_call -> NumArguments() == method -> NumFormalParameters())
  505.                     {
  506.                         int i;
  507.                         for (i = 0; i < method_call -> NumArguments(); i++)
  508.                         {
  509.                             AstExpression *expr =  method_call -> Argument(i);
  510.                             if (! CanMethodInvocationConvert(method -> FormalParameter(i) -> Type(), expr -> Type()))
  511.                                 break;
  512.                         }
  513.                         if (i == method_call -> NumArguments()) // found a match ?
  514.                             break;
  515.                     }
  516.                 }
  517.  
  518.                 if (method_shadow) // found a match ?
  519.                     break;
  520.             }
  521.  
  522.             if (super_type)
  523.             {
  524.                 ReportSemError((method_shadow -> method_symbol -> ACC_PRIVATE()
  525.                                                ? SemanticError::METHOD_WITH_PRIVATE_ACCESS_NOT_ACCESSIBLE
  526.                                                : SemanticError::METHOD_WITH_DEFAULT_ACCESS_NOT_ACCESSIBLE),
  527.                                method_call -> LeftToken(),
  528.                                method_call -> RightToken(),
  529.                                name_symbol -> Name(),
  530.                                super_type -> ContainingPackage() -> PackageName(),
  531.                                super_type -> ExternalName(),
  532.                                type -> ContainingPackage() -> PackageName(),
  533.                                type -> ExternalName());
  534.             }
  535.             else
  536.             {
  537.                 if (FindNestedType(type, field_access -> identifier_token))
  538.                 {
  539.                     ReportSemError(SemanticError::TYPE_NOT_METHOD,
  540.                                    method_call -> LeftToken(),
  541.                                    method_call -> RightToken(),
  542.                                    name_symbol -> Name());
  543.                 }
  544.                 else if (type -> expanded_method_table -> FindMethodShadowSymbol(name_symbol))
  545.                     ReportMethodNotFound(method_call, name_symbol -> Name());
  546.                 else
  547.                 {
  548.                     MethodSymbol *method = FindMisspelledMethodName(type, method_call, name_symbol);
  549.                     if (method)
  550.                          ReportSemError(SemanticError::METHOD_NAME_MISSPELLED,
  551.                                         method_call -> LeftToken(),
  552.                                         method_call -> RightToken(),
  553.                                         name_symbol -> Name(),
  554.                                         type -> ContainingPackage() -> PackageName(),
  555.                                         type -> ExternalName(),
  556.                                         method -> Name());
  557.                     else ReportSemError(SemanticError::METHOD_NAME_NOT_FOUND_IN_TYPE,
  558.                                         method_call -> LeftToken(),
  559.                                         method_call -> RightToken(),
  560.                                         name_symbol -> Name(),
  561.                                         type -> ContainingPackage() -> PackageName(),
  562.                                         type -> ExternalName());
  563.                 }
  564.             }
  565.         }
  566.  
  567.         return (MethodSymbol *) NULL;
  568.     }
  569.     else if (method_set.Length() > 1)
  570.     {
  571.         ReportSemError(SemanticError::AMBIGUOUS_METHOD_INVOCATION,
  572.                        method_call -> LeftToken(),
  573.                        method_call -> RightToken(),
  574.                        name_symbol -> Name(),
  575.                        method_set[0] -> Header(),
  576.                        method_set[0] -> containing_type -> ContainingPackage() -> PackageName(),
  577.                        method_set[0] -> containing_type -> ExternalName(),
  578.                        method_set[1] -> Header(),
  579.                        method_set[1] -> containing_type -> ContainingPackage() -> PackageName(),
  580.                        method_set[1] -> containing_type -> ExternalName());
  581.     }
  582.  
  583.     MethodSymbol *method = method_set[0];
  584.     if (method -> IsSynthetic())
  585.     {
  586.         ReportSemError(SemanticError::SYNTHETIC_METHOD_INVOCATION,
  587.                        method_call -> LeftToken(),
  588.                        method_call -> RightToken(),
  589.                        method -> Header(),
  590.                        method -> containing_type -> ContainingPackage() -> PackageName(),
  591.                        method -> containing_type -> ExternalName());
  592.     }
  593.  
  594.     return method;
  595. }
  596.  
  597.  
  598. void Semantic::SearchForMethodInEnvironment(Tuple<MethodSymbol *> &methods_found,
  599.                                             SemanticEnvironment *&where_found,
  600.                                             SemanticEnvironment *stack,
  601.                                             AstMethodInvocation *method_call)
  602. {
  603.     AstSimpleName *simple_name = method_call -> method -> SimpleNameCast();
  604.     NameSymbol *name_symbol = (NameSymbol *) lex_stream -> NameSymbol(simple_name -> identifier_token);
  605.  
  606.     for (SemanticEnvironment *env = stack; env; env = env -> previous)
  607.     {
  608.         TypeSymbol *type = env -> Type();
  609.         if (! type -> expanded_method_table)
  610.             ComputeMethodsClosure(type, simple_name -> identifier_token);
  611.  
  612.         methods_found.Reset();
  613.         where_found = NULL;
  614.  
  615.         //
  616.         // If this environment contained a method with the right name, the search stops:
  617.         //
  618.         //    "Class scoping does not influence overloading: if the inner class has one
  619.         //     print method, the simple method name 'print' refers to that method, not 
  620.         //     any of the ten 'print' methods in the enclosing class."
  621.         //
  622.         MethodShadowSymbol *method_shadow = type -> expanded_method_table -> FindMethodShadowSymbol(name_symbol);
  623.         if (method_shadow)
  624.         {
  625.             for (; method_shadow; method_shadow = method_shadow -> next_method)
  626.             {
  627.                 MethodSymbol *method = method_shadow -> method_symbol;
  628.                 TypeSymbol *containing_type = method -> containing_type;
  629.  
  630.                 if (! method -> IsTyped())
  631.                     method -> ProcessMethodSignature((Semantic *) this, simple_name -> identifier_token);
  632.  
  633.                 //
  634.                 // Since type -> IsOwner(this_type()), i.e., type encloses this_type(),
  635.                 // method is accessible, even if it is private.
  636.                 //
  637.                 if (method_call -> NumArguments() == method -> NumFormalParameters())
  638.                 {
  639.                     int i;
  640.                     for (i = 0; i < method_call -> NumArguments(); i++)
  641.                     {
  642.                         AstExpression *expr =  method_call -> Argument(i);
  643.                         if (! CanMethodInvocationConvert(method -> FormalParameter(i) -> Type(), expr -> Type()))
  644.                             break;
  645.                     }
  646.                     if (i == method_call -> NumArguments())
  647.                     {
  648.                         if (MoreSpecific(method, methods_found))
  649.                         {
  650.                             methods_found.Reset();
  651.                             methods_found.Next() = method;
  652.                         }
  653.                         else if (NoMethodMoreSpecific(methods_found, method))
  654.                             methods_found.Next() = method;
  655.                     }
  656.                 }
  657.             }
  658.  
  659.             //
  660.             // If a match was found, save the environment
  661.             //
  662.             where_found = (methods_found.Length() > 0 ? env : NULL);
  663.             break;
  664.         }
  665.     }
  666.  
  667.     return;
  668. }
  669.  
  670.  
  671. MethodSymbol *Semantic::FindMethodInEnvironment(SemanticEnvironment *&where_found,
  672.                                                 SemanticEnvironment *stack,
  673.                                                 AstMethodInvocation *method_call)
  674. {
  675.     Tuple<MethodSymbol *> methods_found(2);
  676.     SearchForMethodInEnvironment(methods_found, where_found, stack, method_call);
  677.  
  678.     MethodSymbol *method_symbol = (methods_found.Length() > 0 ? methods_found[0] : (MethodSymbol *) NULL);
  679.     if (method_symbol)
  680.     {
  681.         for (int i = 1; i < methods_found.Length(); i++)
  682.         {
  683.             ReportSemError(SemanticError::AMBIGUOUS_METHOD_INVOCATION,
  684.                            method_call -> LeftToken(),
  685.                            method_call -> RightToken(),
  686.                            method_symbol -> Name(),
  687.                            methods_found[0] -> Header(),
  688.                            method_symbol -> containing_type -> ContainingPackage() -> PackageName(),
  689.                            method_symbol -> containing_type -> ExternalName(),
  690.                            methods_found[i] -> Header(),
  691.                            methods_found[i] -> containing_type -> ContainingPackage() -> PackageName(),
  692.                            methods_found[i] -> containing_type -> ExternalName());
  693.         }
  694.  
  695.         if (method_symbol -> containing_type != where_found -> Type())  // is symbol an inherited field?
  696.         {
  697.             if (method_symbol -> IsSynthetic())
  698.             {
  699.                 ReportSemError(SemanticError::SYNTHETIC_METHOD_INVOCATION,
  700.                                method_call -> LeftToken(),
  701.                                method_call -> RightToken(),
  702.                                method_symbol -> Header(),
  703.                                method_symbol -> containing_type -> ContainingPackage() -> PackageName(),
  704.                                method_symbol -> containing_type -> ExternalName());
  705.             }
  706.             else
  707.             {
  708.                 for (SemanticEnvironment *env = where_found -> previous; env; env = env -> previous)
  709.                 {
  710.                     Tuple<MethodSymbol *> others(2);
  711.                     SemanticEnvironment *found_other;
  712.                     SearchForMethodInEnvironment(others, found_other, env, method_call);
  713.  
  714.                     int i;
  715.                     for (i = 0; i < others.Length();  i++)
  716.                     {
  717.                         if (others[i] != method_symbol)
  718.                         {
  719.                             ReportSemError(SemanticError::INHERITANCE_AND_LEXICAL_SCOPING_CONFLICT_WITH_MEMBER,
  720.                                            method_call -> LeftToken(),
  721.                                            method_call -> RightToken(),
  722.                                            method_symbol -> Name(),
  723.                                            method_symbol -> containing_type -> ContainingPackage() -> PackageName(),
  724.                                            method_symbol -> containing_type -> ExternalName(),
  725.                                            found_other -> Type() -> ContainingPackage() -> PackageName(),
  726.                                            found_other -> Type() -> ExternalName());
  727.                             break;
  728.                         }
  729.                     }
  730.  
  731.                     if (i < others.Length()) // as soon as we find an error, bail out...
  732.                         break;
  733.                 }
  734.             }
  735.         }
  736.     }
  737.     else
  738.     {
  739.         AstSimpleName *simple_name = method_call -> method -> SimpleNameCast();
  740.         NameSymbol *name_symbol = (NameSymbol *) lex_stream -> NameSymbol(simple_name -> identifier_token);
  741.         bool symbol_found = false;
  742.  
  743.         //
  744.         // First, search for a perfect visible method match in an enclosing class.
  745.         //
  746. assert(stack);
  747.         for (SemanticEnvironment *env = stack -> previous; env; env = env -> previous)
  748.         {
  749.             Tuple<MethodSymbol *> others(2);
  750.             SemanticEnvironment *found_other;
  751.             SearchForMethodInEnvironment(others, found_other, env, method_call);
  752.  
  753.             if (others.Length() > 0)
  754.             {
  755.                 ReportSemError(SemanticError::HIDDEN_METHOD_IN_ENCLOSING_CLASS,
  756.                                method_call -> LeftToken(),
  757.                                method_call -> RightToken(),
  758.                                others[0] -> Header(),
  759.                                others[0] -> containing_type -> ContainingPackage() -> PackageName(),
  760.                                others[0] -> containing_type -> ExternalName());
  761.  
  762.                 symbol_found = true;
  763.                 break;
  764.             }
  765.         }
  766.  
  767.         //
  768.         // If a method in an enclosing class was not found. Search for a similar visible field 
  769.         // or a private method with the name.
  770.         //
  771.         for (SemanticEnvironment *env2 = stack; env2 && (! symbol_found); env2 = env2 -> previous)
  772.         {
  773.             TypeSymbol *type = env2 -> Type();
  774.  
  775.             if (! type -> expanded_field_table)
  776.                 ComputeFieldsClosure(type, simple_name -> identifier_token);
  777.  
  778.             VariableShadowSymbol *variable_shadow_symbol = type -> expanded_field_table -> FindVariableShadowSymbol(name_symbol);
  779.             if (variable_shadow_symbol)
  780.             {
  781.                 VariableSymbol *variable_symbol = variable_shadow_symbol -> variable_symbol;
  782.                 TypeSymbol *enclosing_type = variable_symbol -> owner -> TypeCast();
  783. assert(enclosing_type);
  784.                 ReportSemError(SemanticError::FIELD_NOT_METHOD,
  785.                                method_call -> LeftToken(),
  786.                                method_call -> RightToken(),
  787.                                variable_symbol -> Name(),
  788.                                enclosing_type -> ContainingPackage() -> PackageName(),
  789.                                enclosing_type -> ExternalName());
  790.                 symbol_found = true;
  791.                 break;
  792.             }
  793.             else
  794.             {
  795.                 TypeSymbol *super_type;
  796.                 MethodShadowSymbol *method_shadow;
  797.  
  798.                 for (super_type = type -> super; super_type; super_type = super_type -> super)
  799.                 {
  800.                     for (method_shadow = super_type -> expanded_method_table -> FindMethodShadowSymbol(name_symbol);
  801.                          method_shadow; method_shadow = method_shadow -> next_method)
  802.                     {
  803.                         MethodSymbol *method = method_shadow -> method_symbol;
  804.                         if (! method -> IsTyped())
  805.                             method -> ProcessMethodSignature((Semantic *) this, simple_name -> identifier_token);
  806.  
  807.                         if (method_call -> NumArguments() == method -> NumFormalParameters())
  808.                         {
  809.                             int i;
  810.                             for (i = 0; i < method_call -> NumArguments(); i++)
  811.                             {
  812.                                 AstExpression *expr = method_call -> Argument(i);
  813.                                 if (! CanMethodInvocationConvert(method -> FormalParameter(i) -> Type(), expr -> Type()))
  814.                                     break;
  815.                             }
  816.                             if (i == method_call -> NumArguments()) // found a match ?
  817.                                 break;
  818.                         }
  819.                     }
  820.  
  821.                     if (method_shadow) // found a match ?
  822.                         break;
  823.                 }
  824.  
  825.                 if (super_type)
  826.                 {
  827.                     ReportSemError((method_shadow -> method_symbol -> ACC_PRIVATE()
  828.                                                    ? SemanticError::METHOD_WITH_PRIVATE_ACCESS_NOT_ACCESSIBLE
  829.                                                    : SemanticError::METHOD_WITH_DEFAULT_ACCESS_NOT_ACCESSIBLE),
  830.                                    method_call -> LeftToken(),
  831.                                    method_call -> RightToken(),
  832.                                    name_symbol -> Name(),
  833.                                    super_type -> ContainingPackage() -> PackageName(),
  834.                                    super_type -> ExternalName(),
  835.                                    type -> ContainingPackage() -> PackageName(),
  836.                                    type -> ExternalName());
  837.                     symbol_found = true;
  838.                     break;
  839.                 }    
  840.             }
  841.         }
  842.  
  843.         //
  844.         // Finally, if we did not find a method or field name that matches, look for a type
  845.         // with that name.
  846.         //
  847.         if (! symbol_found)
  848.         {
  849.             TypeSymbol *this_type = ThisType();
  850.  
  851.             if (FindType(simple_name -> identifier_token))
  852.             {
  853.                 ReportSemError(SemanticError::TYPE_NOT_METHOD,
  854.                                method_call -> LeftToken(),
  855.                                method_call -> RightToken(),
  856.                                name_symbol -> Name());
  857.             }
  858.             else if (this_type -> expanded_method_table -> FindMethodShadowSymbol(name_symbol))
  859.                 ReportMethodNotFound(method_call, name_symbol -> Name());
  860.             else
  861.             {
  862.                 MethodSymbol *method = FindMisspelledMethodName(this_type, method_call, name_symbol);
  863.                 if (method)
  864.                      ReportSemError(SemanticError::METHOD_NAME_MISSPELLED,
  865.                                     method_call -> LeftToken(),
  866.                                     method_call -> RightToken(),
  867.                                     name_symbol -> Name(),
  868.                                     this_type -> ContainingPackage() -> PackageName(),
  869.                                     this_type -> ExternalName(),
  870.                                     method -> Name());
  871.                 else ReportSemError(SemanticError::METHOD_NAME_NOT_FOUND_IN_TYPE,
  872.                                     method_call -> LeftToken(),
  873.                                     method_call -> RightToken(),
  874.                                     name_symbol -> Name(),
  875.                                     this_type -> ContainingPackage() -> PackageName(),
  876.                                     this_type -> ExternalName());
  877.             }
  878.         }
  879.     }
  880.  
  881.     return method_symbol;
  882. }
  883.  
  884.  
  885.  
  886. //
  887. // Search the type in question for a variable. Note that name_symbol is an optional argument.
  888. // If it was not passed to this function then its default value is NULL (see semantic.h) and
  889. // we assume that the name to search for is the last identifier specified in the field_access.
  890. //
  891. inline VariableSymbol *Semantic::FindVariableInType(TypeSymbol *type, AstFieldAccess *field_access, NameSymbol *name_symbol)
  892. {
  893.     if (! name_symbol)
  894.         name_symbol = (NameSymbol *) lex_stream -> NameSymbol(field_access -> identifier_token);
  895.  
  896.     if (! type -> expanded_field_table)
  897.         ComputeFieldsClosure(type, field_access -> identifier_token);
  898.  
  899. //
  900. // TODO: Confirm that this is no longer the case as of javac 1.2
  901. //
  902. /*
  903.     //
  904.     // First look for the variable in the "type". If it is not found, look for
  905.     // it in the superclasses in the proper order. It is possible that the
  906.     // field in question is a private field that is contained in the body
  907.     // of the type that we are currently processing (this_type()), in which case
  908.     // it is accessible even though it is not directly inherited by "type".
  909.     //
  910.     VariableShadowSymbol *variable_shadow_symbol;
  911.     for (variable_shadow_symbol = NULL; (! variable_shadow_symbol) && type; type = type -> super)
  912.         variable_shadow_symbol = type -> expanded_field_table -> FindVariableShadowSymbol(name_symbol);
  913. */
  914.  
  915.     VariableShadowSymbol *variable_shadow_symbol = type -> expanded_field_table -> FindVariableShadowSymbol(name_symbol);
  916.  
  917.     //
  918.     // Recall that even an inaccessible member x of a super class (or interface) S,
  919.     // in addition to not been inherited by a subclass, hides all other occurrences of x that may
  920.     // appear in a super class (or super interface) of S (see 8.3).
  921.     //
  922.     if (variable_shadow_symbol)
  923.     {
  924.         VariableSymbol *variable_symbol = variable_shadow_symbol -> variable_symbol;
  925.  
  926.         for (int i = 0; i < variable_shadow_symbol -> NumConflicts(); i++)
  927.         {
  928.             ReportSemError(SemanticError::AMBIGUOUS_NAME,
  929.                            field_access -> LeftToken(),
  930.                            field_access -> RightToken(),
  931.                            name_symbol -> Name(),
  932.                            variable_symbol -> owner -> TypeCast() -> ContainingPackage() -> PackageName(),
  933.                            variable_symbol -> owner -> TypeCast() -> ExternalName(),
  934.                            variable_shadow_symbol -> Conflict(i) -> owner -> TypeCast() -> ContainingPackage() -> PackageName(),
  935.                            variable_shadow_symbol -> Conflict(i) -> owner -> TypeCast() -> ExternalName());
  936.         }
  937.  
  938.         if (variable_symbol -> IsSynthetic())
  939.         {
  940.             ReportSemError(SemanticError::SYNTHETIC_VARIABLE_ACCESS,
  941.                            field_access -> LeftToken(),
  942.                            field_access -> RightToken(),
  943.                            variable_symbol -> Name(),
  944.                            variable_symbol -> owner -> TypeCast() -> ContainingPackage() -> PackageName(),
  945.                            variable_symbol -> owner -> TypeCast() -> ExternalName());
  946.         }
  947.         return variable_symbol;
  948.     }
  949.  
  950.     return (VariableSymbol *) NULL;
  951. }
  952.  
  953.  
  954. void Semantic::ReportAccessedFieldNotFound(AstFieldAccess *field_access, TypeSymbol *type)
  955. {
  956.     NameSymbol *name_symbol = (NameSymbol *) lex_stream -> NameSymbol(field_access -> identifier_token);
  957.     VariableShadowSymbol *variable_shadow_symbol;
  958.  
  959.     if (! type -> expanded_field_table)
  960.         ComputeFieldsClosure(type, field_access -> base -> LeftToken());
  961.     TypeSymbol *super_type;
  962.     for (super_type = type -> super; super_type; super_type = super_type -> super)
  963.     {
  964.         variable_shadow_symbol = super_type -> expanded_field_table -> FindVariableShadowSymbol(name_symbol);
  965.         if (variable_shadow_symbol)
  966.             break;
  967.     }
  968.  
  969.     if (super_type)
  970.     {
  971.         VariableSymbol *variable_symbol = variable_shadow_symbol -> variable_symbol;
  972.         ReportSemError((variable_symbol -> ACC_PRIVATE()
  973.                                          ? SemanticError::FIELD_WITH_PRIVATE_ACCESS_NOT_ACCESSIBLE
  974.                                          : SemanticError::FIELD_WITH_DEFAULT_ACCESS_NOT_ACCESSIBLE),
  975.                        field_access -> LeftToken(),
  976.                        field_access -> RightToken(),
  977.                        variable_symbol -> Name(),
  978.                        super_type -> ContainingPackage() -> PackageName(),
  979.                        super_type -> ExternalName(),
  980.                        type -> ContainingPackage() -> PackageName(),
  981.                        type -> ExternalName());
  982.     }    
  983.     else
  984.     {
  985.         VariableSymbol *variable = FindMisspelledVariableName(type, field_access -> identifier_token);
  986.         if (variable)
  987.              ReportSemError(SemanticError::FIELD_NAME_MISSPELLED,
  988.                             field_access -> LeftToken(),
  989.                             field_access -> RightToken(),
  990.                             name_symbol -> Name(),
  991.                             type -> ContainingPackage() -> PackageName(),
  992.                             type -> ExternalName(),
  993.                             variable -> Name());
  994.         else ReportSemError(SemanticError::FIELD_NOT_FOUND,
  995.                             field_access -> LeftToken(),
  996.                             field_access -> RightToken(),
  997.                             lex_stream -> Name(field_access -> identifier_token),
  998.                             type -> ContainingPackage() -> PackageName(),
  999.                             type -> ExternalName());
  1000.     }
  1001.  
  1002.     return;
  1003. }
  1004.  
  1005.  
  1006. void Semantic::SearchForVariableInEnvironment(Tuple<VariableSymbol *> &variables_found,
  1007.                                               SemanticEnvironment *&where_found,
  1008.                                               SemanticEnvironment *stack,
  1009.                                               NameSymbol *name_symbol,
  1010.                                               LexStream::TokenIndex identifier_token)
  1011. {
  1012.     variables_found.Reset();
  1013.     where_found = (SemanticEnvironment *) NULL;
  1014.  
  1015.     for (SemanticEnvironment *env = stack; env; env = env -> previous)
  1016.     {
  1017.         VariableSymbol *variable_symbol = env -> symbol_table.FindVariableSymbol(name_symbol);
  1018.         if (variable_symbol) // a local variable
  1019.         {
  1020.             variables_found.Next() = variable_symbol;
  1021.             where_found = env;
  1022.             break;
  1023.         }
  1024.  
  1025.         TypeSymbol *type = env -> Type();
  1026.         if (! type -> expanded_field_table)
  1027.             ComputeFieldsClosure(type, identifier_token);
  1028.         VariableShadowSymbol *variable_shadow_symbol = type -> expanded_field_table -> FindVariableShadowSymbol(name_symbol);
  1029.         if (variable_shadow_symbol) 
  1030.         {
  1031.             //
  1032.             // Since type -> IsOwner(this_type()), i.e., type encloses this_type(),
  1033.             // variable_symbol is accessible, even if it is private.
  1034.             //
  1035.             variables_found.Next() = variable_shadow_symbol -> variable_symbol;
  1036.  
  1037.             //
  1038.             // Recall that even an inaccessible member x of a super class (or interface) S,
  1039.             // in addition to not been inherited by a subclass, hides all other occurrences of x that may
  1040.             // appear in a super class (or super interface) of S (see 8.3).
  1041.             //
  1042.             for (int i = 0; i < variable_shadow_symbol -> NumConflicts(); i++)
  1043.                 variables_found.Next() = variable_shadow_symbol -> Conflict(i);
  1044.             where_found = env;
  1045.             break;
  1046.         }
  1047.     }
  1048.  
  1049.     return;
  1050. }
  1051.  
  1052.  
  1053. VariableSymbol *Semantic::FindVariableInEnvironment(SemanticEnvironment *&where_found,
  1054.                                                     SemanticEnvironment *stack, LexStream::TokenIndex identifier_token)
  1055. {
  1056.     Tuple<VariableSymbol *> variables_found(2);
  1057.     NameSymbol *name_symbol = (NameSymbol *) lex_stream -> NameSymbol(identifier_token);
  1058.     SearchForVariableInEnvironment(variables_found, where_found, stack, name_symbol, identifier_token);
  1059.  
  1060.     VariableSymbol *variable_symbol = (VariableSymbol *) (variables_found.Length() > 0 ? variables_found[0] : NULL);
  1061.  
  1062.     if (variable_symbol)
  1063.     {
  1064.         if (variable_symbol -> IsLocal()) // a local variable
  1065.         {
  1066.             if (where_found != stack)
  1067.             {
  1068.                 TypeSymbol *type = stack -> Type();
  1069.  
  1070.                 if (! variable_symbol -> ACC_FINAL())
  1071.                 {
  1072.                     MethodSymbol *method = variable_symbol -> owner -> MethodCast();
  1073.  
  1074.                     ReportSemError(SemanticError::INNER_CLASS_REFERENCE_TO_NON_FINAL_LOCAL_VARIABLE,
  1075.                                    identifier_token,
  1076.                                    identifier_token,
  1077.                                    type -> ContainingPackage() -> PackageName(),
  1078.                                    type -> ExternalName(),
  1079.                                    lex_stream -> Name(identifier_token),
  1080.                                    //
  1081.                                    // TODO: What if the method is a constructor ?
  1082.                                    //        if (method -> Identity() != control.init_symbol &&
  1083.                                    //            method -> Identity() != control.block_init_symbol &&
  1084.                                    //            method -> Identity() != control.clinit_symbol)
  1085.                                    //
  1086.                                    //
  1087.                                    method -> Name());
  1088.                 }
  1089.  
  1090.                 type -> FindOrInsertLocalShadow(variable_symbol);
  1091.  
  1092.                 variable_symbol = stack -> symbol_table.FindVariableSymbol(name_symbol);
  1093.                 if (! variable_symbol)
  1094.                     variable_symbol = type -> FindVariableSymbol(name_symbol);
  1095. assert(variable_symbol);
  1096.                 where_found = stack;
  1097.             }
  1098.         }
  1099.         else if (variable_symbol -> owner != where_found -> Type())  // is symbol an inherited field?
  1100.         {
  1101.             TypeSymbol *type = (TypeSymbol *) variable_symbol -> owner;
  1102.  
  1103.             if (variable_symbol -> IsSynthetic())
  1104.             {
  1105.                 ReportSemError(SemanticError::SYNTHETIC_VARIABLE_ACCESS,
  1106.                                identifier_token,
  1107.                                identifier_token,
  1108.                                variable_symbol -> Name(),
  1109.                                type -> ContainingPackage() -> PackageName(),
  1110.                                type -> ExternalName());
  1111.             }
  1112.             else
  1113.             {
  1114.                 for (SemanticEnvironment *env = where_found -> previous; env; env = env -> previous)
  1115.                 {
  1116.                     Tuple<VariableSymbol *> others(2);
  1117.                     SemanticEnvironment *found_other;
  1118.                     SearchForVariableInEnvironment(others, found_other, env, name_symbol, identifier_token);
  1119.  
  1120.                     int i;
  1121.                     for (i = 0; i < others.Length();  i++)
  1122.                     {
  1123.                         if (others[i] != variable_symbol)
  1124.                         {
  1125.                             MethodSymbol *method = others[i] -> owner -> MethodCast();
  1126.  
  1127.                             if (method)
  1128.                             {
  1129.                                 ReportSemError(SemanticError::INHERITANCE_AND_LEXICAL_SCOPING_CONFLICT_WITH_LOCAL,
  1130.                                                identifier_token,
  1131.                                                identifier_token,
  1132.                                                lex_stream -> Name(identifier_token),
  1133.                                                type -> ContainingPackage() -> PackageName(),
  1134.                                                type -> ExternalName(),
  1135.                                                method -> Name());
  1136.                                 break;
  1137.                             }
  1138.                             else
  1139.                             {
  1140.                                 ReportSemError(SemanticError::INHERITANCE_AND_LEXICAL_SCOPING_CONFLICT_WITH_MEMBER,
  1141.                                                identifier_token,
  1142.                                                identifier_token,
  1143.                                                lex_stream -> Name(identifier_token),
  1144.                                                type -> ContainingPackage() -> PackageName(),
  1145.                                                type -> ExternalName(),
  1146.                                                found_other -> Type() -> ContainingPackage() -> PackageName(),
  1147.                                                found_other -> Type() -> ExternalName());
  1148.                                 break;
  1149.                             }
  1150.                         }
  1151.                     }
  1152.  
  1153.                     if (i < others.Length()) // as soon as we find an error, bail out...
  1154.                         break;
  1155.                 }
  1156.             }
  1157.         }
  1158.     }
  1159.  
  1160.     for (int i = 1; i < variables_found.Length(); i++)
  1161.     {
  1162.         ReportSemError(SemanticError::AMBIGUOUS_NAME,
  1163.                        identifier_token,
  1164.                        identifier_token,
  1165.                        variable_symbol -> Name(),
  1166.                        variable_symbol -> owner -> TypeCast() -> ContainingPackage() -> PackageName(),
  1167.                        variable_symbol -> owner -> TypeCast() -> ExternalName(),
  1168.                        variables_found[i] -> owner -> TypeCast() -> ContainingPackage() -> PackageName(),
  1169.                        variables_found[i] -> owner -> TypeCast() -> ExternalName());
  1170.     }
  1171.  
  1172.     return variable_symbol;
  1173. }
  1174.  
  1175.  
  1176. VariableSymbol *Semantic::FindInstance(TypeSymbol *base_type, TypeSymbol *environment_type)
  1177. {
  1178.     for (int i = 0; i < base_type -> NumEnclosingInstances(); i++)
  1179.     {
  1180.         VariableSymbol *variable = base_type -> EnclosingInstance(i);
  1181.         if (variable -> Type() -> IsSubclass(environment_type))
  1182.             return variable;
  1183.     }
  1184.  
  1185.     AstClassDeclaration *class_declaration = base_type -> declaration -> ClassDeclarationCast();
  1186.     AstClassInstanceCreationExpression *class_creation = base_type -> declaration -> ClassInstanceCreationExpressionCast();
  1187. assert(class_declaration || class_creation);
  1188.     AstClassBody *class_body = (class_declaration ? class_declaration -> class_body : class_creation -> class_body_opt);
  1189.  
  1190.     LexStream::TokenIndex loc = class_body -> left_brace_token;
  1191.     AstBlock *this_block = class_body -> this_block;
  1192.     if (! this_block)
  1193.     {
  1194.         this_block = compilation_unit -> ast_pool -> GenBlock();
  1195.         this_block -> left_brace_token  = loc;
  1196.         this_block -> right_brace_token = loc;
  1197.  
  1198.         this_block -> is_reachable = true;
  1199.         this_block -> can_complete_normally = true;
  1200.  
  1201.         class_body -> this_block = this_block;
  1202.     }
  1203.  
  1204.     int k = base_type -> NumEnclosingInstances();
  1205.     for (TypeSymbol *type = base_type -> EnclosingInstance(k - 1) -> Type(); type; type = type -> ContainingType(), k++)
  1206.     {
  1207.         AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(loc);
  1208.         simple_name -> symbol = base_type -> EnclosingInstance(k - 1);
  1209.  
  1210.         AstFieldAccess *field_access = compilation_unit -> ast_pool -> GenFieldAccess();
  1211.         field_access -> base = simple_name;
  1212.         field_access -> dot_token = loc;
  1213.         field_access -> identifier_token = loc;
  1214.         field_access -> symbol = type -> FindThis(0);
  1215.  
  1216.         AstMethodInvocation *rhs      = compilation_unit -> ast_pool -> GenMethodInvocation();
  1217.         rhs -> method                  = field_access;
  1218.         rhs -> left_parenthesis_token  = loc;
  1219.         rhs -> right_parenthesis_token = loc;
  1220.         rhs -> symbol                  = TypeSymbol::GetReadAccessMethod((VariableSymbol *) field_access -> symbol);
  1221.  
  1222.         AstSimpleName *lhs = compilation_unit -> ast_pool -> GenSimpleName(loc);
  1223.         VariableSymbol *variable = base_type -> FindThis(k);
  1224.         lhs -> symbol = (variable ? variable : base_type -> InsertThis(k));
  1225.  
  1226.         AstAssignmentExpression *assign = compilation_unit -> ast_pool
  1227.                                                             -> GenAssignmentExpression(AstAssignmentExpression::EQUAL, loc);
  1228.         assign -> left_hand_side = lhs;
  1229.         assign -> expression     = rhs;
  1230.         assign -> symbol         = lhs -> Type();
  1231.  
  1232.         AstExpressionStatement *stmt = compilation_unit -> ast_pool -> GenExpressionStatement();
  1233.         stmt -> expression          = assign;
  1234.         stmt -> semicolon_token_opt = loc;
  1235.         stmt -> is_reachable = true;
  1236.         stmt -> can_complete_normally = true;
  1237.  
  1238.         this_block -> AddStatement(stmt);
  1239.  
  1240.         if (lhs -> Type() -> IsSubclass(environment_type))
  1241.             break;
  1242.     }
  1243.  
  1244.     return base_type -> EnclosingInstance(k);
  1245. }
  1246.  
  1247.  
  1248. AstExpression *Semantic::CreateAccessToType(Ast *source, TypeSymbol *environment_type)
  1249. {
  1250.     TypeSymbol *this_type = ThisType();
  1251.  
  1252.     LexStream::TokenIndex tok;
  1253.  
  1254.     AstSimpleName *simple_name = source -> SimpleNameCast();
  1255.     AstFieldAccess *field_access = source -> FieldAccessCast();
  1256.     AstSuperCall *super_call = source -> SuperCallCast();
  1257.     AstThisCall *this_call = source -> ThisCallCast();
  1258.     AstClassInstanceCreationExpression *class_creation = source -> ClassInstanceCreationExpressionCast();
  1259.  
  1260.     if (simple_name)
  1261.          tok = simple_name -> identifier_token;
  1262.     else if (class_creation)
  1263.          tok = class_creation -> new_token;
  1264.     else if (super_call)
  1265.          tok = super_call -> super_token;
  1266.     else if (this_call)
  1267.          tok = this_call -> this_token;
  1268.     else if (field_access)
  1269.          tok = field_access -> dot_token;
  1270.     else assert(0);
  1271.  
  1272.     AstExpression *resolution;
  1273.  
  1274.     if (! this_type -> CanAccess(environment_type))
  1275.     {
  1276.         ReportSemError(SemanticError::ENCLOSING_INSTANCE_NOT_ACCESSIBLE,
  1277.                        (field_access ? field_access -> base -> LeftToken() : tok),
  1278.                        (field_access ? field_access -> base -> RightToken() : tok),
  1279.                        environment_type -> ContainingPackage() -> PackageName(),
  1280.                        environment_type -> ExternalName());
  1281.  
  1282.         resolution = compilation_unit -> ast_pool -> GenSimpleName(tok);
  1283.         resolution -> symbol = control.no_type;
  1284.     }
  1285.     else if (ExplicitConstructorInvocation() && ExplicitConstructorInvocation() -> SuperCallCast())
  1286.     {
  1287.         VariableSymbol *variable = LocalSymbolTable().FindVariableSymbol(control.this0_name_symbol);
  1288.         if (variable)
  1289.         {
  1290.             resolution = compilation_unit -> ast_pool -> GenSimpleName(tok);
  1291.             resolution -> symbol = variable;
  1292.             TypeSymbol *containing_type = this_type -> ContainingType();
  1293.             if (! containing_type -> IsSubclass(environment_type))
  1294.             {
  1295.                 variable = FindInstance(containing_type, environment_type);
  1296.  
  1297.                 AstFieldAccess *field_access = compilation_unit -> ast_pool -> GenFieldAccess();
  1298.                 field_access -> base = resolution;
  1299.                 field_access -> dot_token = field_access -> dot_token;
  1300.                 field_access -> identifier_token = field_access -> dot_token;
  1301.                 field_access -> symbol = variable;
  1302.  
  1303.                 AstMethodInvocation *method_call      = compilation_unit -> ast_pool -> GenMethodInvocation();
  1304.                 method_call -> method                  = field_access;
  1305.                 method_call -> left_parenthesis_token  = field_access -> dot_token;
  1306.                 method_call -> right_parenthesis_token = field_access -> dot_token;
  1307.                 method_call -> symbol                  = TypeSymbol::GetReadAccessMethod(variable);
  1308.  
  1309.                 resolution = method_call;
  1310.             }
  1311.         }
  1312.         else
  1313.         {
  1314. assert(this_type -> ACC_STATIC());
  1315.             resolution = compilation_unit -> ast_pool -> GenThisExpression(tok);
  1316.             resolution -> symbol = this_type;
  1317.         }
  1318.     }
  1319.     else if (this_type -> IsSubclass(environment_type))
  1320.     {
  1321.         resolution = compilation_unit -> ast_pool -> GenThisExpression(tok);
  1322.         resolution -> symbol = this_type;
  1323.     }
  1324.     else
  1325.     {
  1326.         resolution = compilation_unit -> ast_pool -> GenSimpleName(tok);
  1327.         resolution -> symbol = FindInstance(this_type, environment_type);
  1328.     }
  1329.  
  1330.     return ((resolution -> symbol == control.no_type) || (resolution -> Type() == environment_type)
  1331.                                                        ? resolution
  1332.                                                        : ConvertToType(resolution, environment_type));
  1333. }
  1334.  
  1335.  
  1336. void Semantic::CreateAccessToScopedVariable(AstSimpleName *simple_name, TypeSymbol *environment_type)
  1337. {
  1338. assert(environment_type -> IsOwner(ThisType()));
  1339.     VariableSymbol *variable_symbol = (VariableSymbol *) simple_name -> symbol;
  1340.  
  1341.     AstExpression *access_expression;
  1342.     if (variable_symbol -> ACC_STATIC())
  1343.     {
  1344.         access_expression = compilation_unit -> ast_pool -> GenSimpleName(simple_name -> identifier_token);
  1345.         access_expression -> symbol = environment_type;
  1346.     }
  1347.     else access_expression = CreateAccessToType(simple_name, environment_type);
  1348.  
  1349.     if (access_expression -> symbol != control.no_type)
  1350.     {
  1351.         AstFieldAccess *field_access = compilation_unit -> ast_pool -> GenFieldAccess();
  1352.         field_access -> base = access_expression;
  1353.         field_access -> dot_token = simple_name -> identifier_token;
  1354.         field_access -> identifier_token = simple_name -> identifier_token;
  1355.         field_access -> symbol = variable_symbol;
  1356.  
  1357.         //
  1358.         // TODO: we have filed a query to Sun regarding the necessity of this check!
  1359.         //
  1360.         // SimpleNameAccessCheck(simple_name, variable_symbol -> owner -> TypeCast(), variable_symbol);
  1361.         //
  1362.  
  1363.         if (variable_symbol -> ACC_PRIVATE())
  1364.         {
  1365.             AstMethodInvocation *method_call       = compilation_unit -> ast_pool -> GenMethodInvocation();
  1366.             method_call -> method                  = field_access;
  1367.             method_call -> left_parenthesis_token  = simple_name -> identifier_token;
  1368.             method_call -> right_parenthesis_token = simple_name -> identifier_token;
  1369.             method_call -> symbol                  = TypeSymbol::GetReadAccessMethod(variable_symbol);
  1370.  
  1371.             simple_name -> resolution_opt = method_call;
  1372.         }
  1373.         else simple_name -> resolution_opt = field_access;
  1374.     }
  1375.  
  1376.     return;
  1377. }
  1378.  
  1379.  
  1380. void Semantic::CreateAccessToScopedMethod(AstMethodInvocation *method_call, TypeSymbol *environment_type)
  1381. {
  1382. assert(environment_type -> IsOwner(ThisType()));
  1383.     MethodSymbol *method = (MethodSymbol *) method_call -> symbol;
  1384.     AstSimpleName *simple_name = (AstSimpleName *) method_call -> method;
  1385. assert(simple_name -> SimpleNameCast());
  1386.  
  1387.     AstExpression *access_expression;
  1388.     if (method -> ACC_STATIC())
  1389.     {
  1390.         access_expression = compilation_unit -> ast_pool -> GenSimpleName(simple_name -> identifier_token);
  1391.         access_expression -> symbol = environment_type;
  1392.     }
  1393.     else access_expression = CreateAccessToType(simple_name, environment_type);
  1394.  
  1395.     if (access_expression -> symbol != control.no_type)
  1396.     {
  1397.         //
  1398.         // TODO: we have filed a query to Sun regarding the necessity of this check!
  1399.         //
  1400.         // SimpleNameAccessCheck(simple_name, method -> containing_type, method);
  1401.         //
  1402.  
  1403.         simple_name -> resolution_opt = access_expression;
  1404.         if (method -> ACC_PRIVATE())
  1405.             method_call -> symbol = TypeSymbol::GetReadAccessMethod(method);
  1406.     }
  1407.  
  1408.     return;
  1409. }
  1410.  
  1411.  
  1412. void Semantic::ProcessSimpleName(Ast *expr)
  1413. {
  1414.     TypeSymbol *this_type = ThisType();
  1415.  
  1416.     AstSimpleName *simple_name = (AstSimpleName *) expr;
  1417.     SemanticEnvironment *where_found;
  1418.     VariableSymbol *variable_symbol = FindVariableInEnvironment(where_found, state_stack.Top(), simple_name -> identifier_token);
  1419.     if (variable_symbol)
  1420.     {
  1421.         simple_name -> symbol = variable_symbol;
  1422.  
  1423.         if (! variable_symbol -> IsTyped())
  1424.             variable_symbol -> ProcessVariableSignature((Semantic *) this, simple_name -> identifier_token);
  1425.  
  1426.         //
  1427.         // A variable_symbol FINAL must have an initial value.
  1428.         //
  1429.         if (variable_symbol -> ACC_FINAL())
  1430.         {
  1431.             if (variable_symbol -> IsDeclarationComplete())
  1432.                 simple_name -> value = variable_symbol -> initial_value;
  1433.             else if (variable_symbol -> declarator)
  1434.             {
  1435.                 AstVariableDeclarator *declarator = variable_symbol -> declarator -> VariableDeclaratorCast();
  1436.                 //
  1437.                 // If the variable declarator in question exists and its computation is not
  1438.                 // pending (to avoid looping) and it has a simple expression initializer.
  1439.                 //
  1440.                 if (declarator &&
  1441.                     (! declarator -> pending) && 
  1442.                     declarator -> variable_initializer_opt &&
  1443.                     (! declarator -> variable_initializer_opt -> ArrayInitializerCast()))
  1444.                 {
  1445.                     TypeSymbol *type = (TypeSymbol *) variable_symbol -> owner;
  1446.                     Semantic *sem = type -> semantic_environment -> sem;
  1447.                     simple_name -> value = sem -> ComputeFinalValue(declarator);
  1448.                 }
  1449.             }
  1450.         }
  1451.  
  1452.         //
  1453.         // If the variable belongs to an outer type, add the proper
  1454.         // pointer dereferences (and method access in the case of a
  1455.         // private variable) necessary to get to it.
  1456.         //
  1457.         if (where_found != state_stack.Top())
  1458.             CreateAccessToScopedVariable(simple_name, where_found -> Type());
  1459.  
  1460.         // 
  1461.         // CreateAccessToScopedVariable did not detect an error?
  1462.         // 
  1463.         if (simple_name -> symbol != control.no_type)
  1464.         {
  1465.             if (StaticRegion())
  1466.             {
  1467.                 if (! (variable_symbol -> IsLocal() || variable_symbol -> ACC_STATIC()))
  1468.                 {
  1469.                     ReportSemError(SemanticError::NAME_NOT_CLASS_VARIABLE,
  1470.                                    simple_name -> identifier_token,
  1471.                                    simple_name -> identifier_token,
  1472.                                    lex_stream -> Name(simple_name -> identifier_token));
  1473.                 }
  1474.                 else if (! variable_symbol -> IsDeclarationComplete())
  1475.                 {
  1476.                     ReportSemError(SemanticError::NAME_NOT_YET_AVAILABLE,
  1477.                                    simple_name -> identifier_token,
  1478.                                    simple_name -> identifier_token,
  1479.                                    lex_stream -> Name(simple_name -> identifier_token));
  1480.                 }
  1481.             }
  1482.             else if (! variable_symbol -> ACC_STATIC()) // an instance variable?
  1483.             {
  1484.                 TypeSymbol *containing_type = variable_symbol -> owner -> TypeCast(); // an instance field member ?
  1485.  
  1486.                 if (containing_type)
  1487.                 {
  1488.                     if (containing_type == this_type && (! variable_symbol -> IsDeclarationComplete()))
  1489.                     {
  1490.                         ReportSemError(SemanticError::NAME_NOT_YET_AVAILABLE,
  1491.                                        simple_name -> identifier_token,
  1492.                                        simple_name -> identifier_token,
  1493.                                        lex_stream -> Name(simple_name -> identifier_token));
  1494.                     }
  1495.                     else if (ExplicitConstructorInvocation() && where_found == state_stack.Top())
  1496.                     {
  1497.                         //
  1498.                         // If the variable in question is an instance variable that is
  1499.                         // declared in this_type (this_type is definitely a class) or
  1500.                         // one of its super classes, then we have an error:
  1501.                         //
  1502.                         ReportSemError(SemanticError::INSTANCE_VARIABLE_IN_EXPLICIT_CONSTRUCTOR_INVOCATION,
  1503.                                        simple_name -> identifier_token,
  1504.                                        simple_name -> identifier_token,
  1505.                                        lex_stream -> Name(simple_name -> identifier_token),
  1506.                                        containing_type -> Name());
  1507.                     }
  1508.                 }
  1509.             }
  1510.         }
  1511.     }
  1512.     else
  1513.     {
  1514.         //
  1515.         // We make a little effort to issue a better error message if we can identify
  1516.         // the name in question as the name of a method in the local type.
  1517.         //
  1518.         NameSymbol *name_symbol = (NameSymbol *) lex_stream -> NameSymbol(simple_name -> identifier_token);
  1519.  
  1520.         MethodShadowSymbol *method_shadow;
  1521.         MethodSymbol *method;
  1522.  
  1523.         for (method_shadow = this_type -> expanded_method_table -> FindMethodShadowSymbol(name_symbol);
  1524.              method_shadow; method_shadow = method_shadow -> next_method)
  1525.         {
  1526.             method = method_shadow -> method_symbol;
  1527.             TypeSymbol *containing_type = method -> containing_type;
  1528.  
  1529.             if (method -> NumFormalParameters((Semantic *) this, simple_name -> identifier_token) == 0)
  1530.                 break;
  1531.         }
  1532.                                                    
  1533.         if (method_shadow)
  1534.         {
  1535.              ReportSemError(SemanticError::METHOD_NOT_FIELD,
  1536.                             simple_name -> identifier_token,
  1537.                             simple_name -> identifier_token,
  1538.                             lex_stream -> Name(simple_name -> identifier_token),
  1539.                             method -> containing_type -> ContainingPackage() -> PackageName(),
  1540.                             method -> containing_type -> ExternalName());
  1541.         }
  1542.         else if (FindType(simple_name -> identifier_token))
  1543.         {
  1544.              ReportSemError(SemanticError::TYPE_NOT_FIELD,
  1545.                             simple_name -> identifier_token,
  1546.                             simple_name -> identifier_token,
  1547.                             lex_stream -> Name(simple_name -> identifier_token));
  1548.         }
  1549.         else
  1550.         {
  1551.             VariableSymbol *variable = FindMisspelledVariableName(this_type, simple_name -> identifier_token);
  1552.             if (variable)
  1553.                  ReportSemError(SemanticError::FIELD_NAME_MISSPELLED,
  1554.                                 simple_name -> identifier_token,
  1555.                                 simple_name -> identifier_token,
  1556.                                 name_symbol -> Name(),
  1557.                                 this_type -> ContainingPackage() -> PackageName(),
  1558.                                 this_type -> ExternalName(),
  1559.                                 variable -> Name());
  1560.             else ReportSemError(SemanticError::NAME_NOT_FOUND,
  1561.                                 simple_name -> identifier_token,
  1562.                                 simple_name -> identifier_token,
  1563.                                 lex_stream -> Name(simple_name -> identifier_token));
  1564.         }
  1565.         simple_name -> symbol = control.no_type;
  1566.     }
  1567.  
  1568.     return;
  1569. }
  1570.  
  1571.  
  1572. void Semantic::TypeAccessCheck(Ast *ast, TypeSymbol *type)
  1573. {
  1574.     //
  1575.     // Unless we are processing the body of a type do not do type checking.
  1576.     // (This method may be invoked, for example, when FindFirstType invokes ProcessPackageOrType)
  1577.     //
  1578.     if (state_stack.Size() > 0)
  1579.     {
  1580.         TypeSymbol *this_type = ThisType();
  1581.  
  1582.         //
  1583.         // Type checking is necessary only for two types that are not enclosed within
  1584.         // the same outermost type. Note that if we are trying to access an inner type
  1585.         // T1.T2...Tn from this type, TypeAccessCheck is expected to be invoked first
  1586.         // for T1, then T1.T2, ... and finally for T1.T2...Tn, in turn. When invoked
  1587.         // for T1.T2, for example, this function only checks whether or not T1.T2
  1588.         // is accessible from "this" type. It does not recheck whether or not T1 is
  1589.         // accessible.
  1590.         //
  1591.         if (this_type -> outermost_type != type -> outermost_type)
  1592.         {
  1593.             if (type -> ACC_PRIVATE())
  1594.                  ReportTypeInaccessible(ast, type);
  1595.             else if (type -> ACC_PROTECTED())
  1596.             {
  1597.                 //
  1598.                 // TODO: we have filed a query to Sun regarding which test is required here!
  1599.                 //
  1600.                 // if (! (type -> ContainingPackage() == this_package || this_type -> IsSubclass(type)))
  1601.                 //
  1602.                 if (! (type -> ContainingPackage() == this_package || this_type -> HasProtectedAccessTo(type)))
  1603.                     ReportTypeInaccessible(ast, type);
  1604.             }
  1605.             else if (! (type -> ACC_PUBLIC() || type -> ContainingPackage() == this_package))
  1606.                  ReportTypeInaccessible(ast, type);
  1607.         }
  1608.     }
  1609.  
  1610.     return;
  1611. }
  1612.  
  1613.  
  1614. void Semantic::TypeNestAccessCheck(AstExpression *name)
  1615. {
  1616.     AstSimpleName *simple_name = name -> SimpleNameCast();
  1617.     AstFieldAccess *field_access = name -> FieldAccessCast();
  1618. assert(simple_name || field_access);
  1619.     if (field_access)
  1620.         TypeNestAccessCheck(field_access -> base);
  1621.  
  1622.     TypeSymbol *type = (simple_name ? simple_name -> Type() : field_access -> Type());
  1623.     if (type)
  1624.         TypeAccessCheck(name, type);
  1625.  
  1626.     return;
  1627. }
  1628.  
  1629.  
  1630. void Semantic::ConstructorAccessCheck(AstClassInstanceCreationExpression *class_creation, MethodSymbol *constructor)
  1631. {
  1632.     TypeSymbol *this_type = ThisType();
  1633.     TypeSymbol *containing_type = constructor -> containing_type;
  1634.  
  1635.     if (this_type -> outermost_type != containing_type -> outermost_type)
  1636.     {
  1637.         if (constructor -> ACC_PRIVATE())
  1638.         {
  1639.             ReportSemError(SemanticError::PRIVATE_CONSTRUCTOR_NOT_ACCESSIBLE,
  1640.                            class_creation -> class_type -> LeftToken(),
  1641.                            class_creation -> right_parenthesis_token,
  1642.                            constructor -> Header(),
  1643.                            containing_type -> ContainingPackage() -> PackageName(),
  1644.                            containing_type -> ExternalName());
  1645.         }
  1646.         else if (! class_creation -> symbol -> TypeCast() -> Anonymous())
  1647.         {
  1648.             if (constructor -> ACC_PROTECTED())
  1649.             {
  1650.                 //
  1651.                 // TODO: we need to file a query to Sun regarding which test is required here!
  1652.                 // According to the rules 6.6.2 in the JLS, access to a protected constructor
  1653.                 // that is not contained in the same package is only valid through a "super(...)" call.
  1654.                 // However, javac seems to have relaxed this restriction to allow subclass access...
  1655.                 //
  1656.                 //
  1657.                 // TODO: we have filed a query to Sun regarding which test is required here!
  1658.                 //
  1659.                 // if (! (containing_type -> ContainingPackage() == this_package || this_type -> IsSubclass(containing_type)))
  1660.                 //
  1661.                 if (! (containing_type -> ContainingPackage() == this_package || this_type -> HasProtectedAccessTo(containing_type)))
  1662.                 {
  1663.                     ReportSemError(SemanticError::PROTECTED_CONSTRUCTOR_NOT_ACCESSIBLE,
  1664.                                    class_creation -> class_type -> LeftToken(),
  1665.                                    class_creation -> right_parenthesis_token,
  1666.                                    constructor -> Header(),
  1667.                                    containing_type -> ContainingPackage() -> PackageName(),
  1668.                                    containing_type -> ExternalName());
  1669.                 }
  1670.             }
  1671.             else if (! (constructor -> ACC_PUBLIC() || containing_type -> ContainingPackage() == this_package))
  1672.             {
  1673.                 ReportSemError(SemanticError::DEFAULT_CONSTRUCTOR_NOT_ACCESSIBLE,
  1674.                                class_creation -> class_type -> LeftToken(),
  1675.                                class_creation -> right_parenthesis_token,
  1676.                                constructor -> Header(),
  1677.                                containing_type -> ContainingPackage() -> PackageName(),
  1678.                                containing_type -> ExternalName());
  1679.             }
  1680.         }
  1681.     }
  1682.  
  1683.     return;
  1684. }
  1685.  
  1686.  
  1687. void Semantic::MemberAccessCheck(AstFieldAccess *field_access, TypeSymbol *base_type, TypeSymbol *containing_type, Symbol *symbol)
  1688. {
  1689.     TypeSymbol *this_type = ThisType();
  1690.  
  1691.     VariableSymbol *variable_symbol = symbol -> VariableCast();
  1692.     MethodSymbol *method_symbol = symbol -> MethodCast();
  1693. assert(variable_symbol || method_symbol);
  1694.     AccessFlags *flags = (variable_symbol ? (AccessFlags *) variable_symbol : (AccessFlags *) method_symbol);
  1695.  
  1696.     AstExpression *base = field_access -> base;
  1697.     if (! (containing_type -> ACC_PUBLIC() || base_type -> ContainingPackage() == containing_type -> ContainingPackage()))
  1698.         ReportTypeInaccessible(base, containing_type);
  1699.  
  1700.     if (this_type -> outermost_type != containing_type -> outermost_type)
  1701.     {
  1702.         if (flags -> ACC_PRIVATE())
  1703.         {
  1704.             ReportSemError((variable_symbol ? SemanticError::PRIVATE_FIELD_NOT_ACCESSIBLE
  1705.                                             : SemanticError::PRIVATE_METHOD_NOT_ACCESSIBLE),
  1706.                            field_access -> identifier_token,
  1707.                            field_access -> identifier_token,
  1708.                            lex_stream -> Name(field_access -> identifier_token),
  1709.                            containing_type -> ContainingPackage() -> PackageName(),
  1710.                            containing_type -> ExternalName());
  1711.         }
  1712.         else if (flags -> ACC_PROTECTED())
  1713.         {
  1714.             //
  1715.             // TODO: we have filed a query to Sun regarding which test is required here!
  1716.             //       there also appears to be a mistake in the Language Spec in section
  1717.             //       6.6.2 re. access to protected members. The phrase "Q is S or a subclass of S"
  1718.             //       should have been "Q is S or a superclass of S".
  1719.             //       
  1720.             // if (! (containing_type -> ContainingPackage() == this_package || this_type -> IsSubclass(containing_type)))
  1721.             //
  1722.             if (! (base -> SuperExpressionCast() ||
  1723.                    containing_type -> ContainingPackage() == this_package ||
  1724.                    (this_type -> HasProtectedAccessTo(containing_type) && 
  1725.                     (base_type -> IsSubclass(this_type) || base_type -> IsOwner(this_type)))))
  1726.             {
  1727.                 ReportSemError((variable_symbol ? SemanticError::PROTECTED_FIELD_NOT_ACCESSIBLE
  1728.                                                 : SemanticError::PROTECTED_METHOD_NOT_ACCESSIBLE),
  1729.                                field_access -> identifier_token,
  1730.                                field_access -> identifier_token,
  1731.                                lex_stream -> Name(field_access -> identifier_token),
  1732.                                containing_type -> ContainingPackage() -> PackageName(),
  1733.                                containing_type -> ExternalName());
  1734.             }
  1735.         }
  1736.         else if (! (flags -> ACC_PUBLIC() || containing_type -> ContainingPackage() == this_package))
  1737.         {
  1738.             ReportSemError((variable_symbol ? SemanticError::DEFAULT_FIELD_NOT_ACCESSIBLE
  1739.                                             : SemanticError::DEFAULT_METHOD_NOT_ACCESSIBLE),
  1740.                            field_access -> identifier_token,
  1741.                            field_access -> identifier_token,
  1742.                            lex_stream -> Name(field_access -> identifier_token),
  1743.                            containing_type -> ContainingPackage() -> PackageName(),
  1744.                            containing_type -> ExternalName());
  1745.         }
  1746.     }
  1747.  
  1748.     return;
  1749. }
  1750.  
  1751.  
  1752. void Semantic::SimpleNameAccessCheck(AstSimpleName *simple_name, TypeSymbol *containing_type, Symbol *symbol)
  1753. {
  1754.     TypeSymbol *this_type = ThisType();
  1755.  
  1756.     VariableSymbol *variable_symbol = symbol -> VariableCast();
  1757.     MethodSymbol *method_symbol = symbol -> MethodCast();
  1758. assert(variable_symbol || method_symbol);
  1759.     AccessFlags *flags = (variable_symbol ? (AccessFlags *) variable_symbol : (AccessFlags *) method_symbol);
  1760.  
  1761.     if (! (containing_type -> ACC_PUBLIC() || this_type -> ContainingPackage() == containing_type -> ContainingPackage()))
  1762.         ReportTypeInaccessible(simple_name, containing_type);
  1763.  
  1764.     if (this_type -> outermost_type != containing_type -> outermost_type)
  1765.     {
  1766.         if (flags -> ACC_PRIVATE())
  1767.         {
  1768.             ReportSemError((variable_symbol ? SemanticError::PRIVATE_FIELD_NOT_ACCESSIBLE
  1769.                                             : SemanticError::PRIVATE_METHOD_NOT_ACCESSIBLE),
  1770.                            simple_name -> identifier_token,
  1771.                            simple_name -> identifier_token,
  1772.                            lex_stream -> Name(simple_name -> identifier_token),
  1773.                            containing_type -> ContainingPackage() -> PackageName(),
  1774.                            containing_type -> ExternalName());
  1775.         }
  1776.         else if (flags -> ACC_PROTECTED())
  1777.         {
  1778.             if (! (containing_type -> ContainingPackage() == this_package || this_type -> IsSubclass(containing_type)))
  1779.             {
  1780.                 ReportSemError((variable_symbol ? SemanticError::PROTECTED_FIELD_NOT_ACCESSIBLE
  1781.                                                 : SemanticError::PROTECTED_METHOD_NOT_ACCESSIBLE),
  1782.                                simple_name -> identifier_token,
  1783.                                simple_name -> identifier_token,
  1784.                                lex_stream -> Name(simple_name -> identifier_token),
  1785.                                containing_type -> ContainingPackage() -> PackageName(),
  1786.                                containing_type -> ExternalName());
  1787.             }
  1788.         }
  1789.         else if (! (flags -> ACC_PUBLIC() || containing_type -> ContainingPackage() == this_package))
  1790.         {
  1791.             ReportSemError((variable_symbol ? SemanticError::DEFAULT_FIELD_NOT_ACCESSIBLE
  1792.                                             : SemanticError::DEFAULT_METHOD_NOT_ACCESSIBLE),
  1793.                            simple_name -> identifier_token,
  1794.                            simple_name -> identifier_token,
  1795.                            lex_stream -> Name(simple_name -> identifier_token),
  1796.                            containing_type -> ContainingPackage() -> PackageName(),
  1797.                            containing_type -> ExternalName());
  1798.         }
  1799.     }
  1800.  
  1801.     return;
  1802. }
  1803.  
  1804.  
  1805. void Semantic::FindVariableMember(TypeSymbol *type, AstFieldAccess *field_access)
  1806. {
  1807.     TypeSymbol *this_type = ThisType();
  1808.  
  1809.     //
  1810.     // This operation may throw NullPointerException
  1811.     //
  1812.     SymbolSet *exception_set = TryExceptionTableStack().Top();
  1813.     if (exception_set)
  1814.     {
  1815.         exception_set -> AddElement(control.RuntimeException());
  1816.         exception_set -> AddElement(control.Error());
  1817.     }
  1818.     
  1819.     if (type -> Bad())
  1820.     {
  1821.         //
  1822.         // If no error has been detected so far, report this as an error so that
  1823.         // we don't try to generate code later. On the other hand, if an error
  1824.         // had been detected prior to this, don't flood the user with spurious
  1825.         // messages.
  1826.         //
  1827.         if (NumErrors() == 0)
  1828.             ReportAccessedFieldNotFound(field_access, type);
  1829.         field_access -> symbol = control.no_type;
  1830.     }
  1831.     else if (type == control.null_type || type -> Primitive())
  1832.     {
  1833.         ReportSemError(SemanticError::TYPE_NOT_REFERENCE,
  1834.                        field_access -> base -> LeftToken(),
  1835.                        field_access -> base -> RightToken(),
  1836.                        type -> Name());
  1837.         field_access -> symbol = control.no_type;
  1838.     }
  1839.     else
  1840.     {
  1841.         TypeAccessCheck(field_access -> base, type);
  1842.  
  1843.         VariableSymbol *variable_symbol = FindVariableInType(type, field_access);
  1844.         if (variable_symbol)
  1845.         {
  1846.             //
  1847.             // If a variable is FINAL and initialized with a constant expression,
  1848.             // we substitute the expression here. JLS section 15.27, pp 381-382.
  1849.             //
  1850.             // TODO: Note that the JLS is a bit ambiguous and that a strict reading
  1851.             // of 15.27 would prohibit substitution of a final constant value here. 
  1852.             // However, javac seems to accept it and as the section on qualified name
  1853.             // only mentions "final" but not "static" and as it is not possible to derefence
  1854.             // a non-static final with a TypeName, we decided to relax the rules also.
  1855.             //
  1856.             if (variable_symbol -> ACC_FINAL() && field_access -> base -> IsName())
  1857.             {
  1858.                 //
  1859.                 // If the field declaration of the type has been completely processed,
  1860.                 // simply retrieve the value. Otherwise, compute the value of the
  1861.                 // initialization expression in question on the fly if the variable
  1862.                 // in question is not in the same type. Recall that static variables 
  1863.                 // must be processed in the textual order in which they appear in the
  1864.                 // body of a type. Therefore, if the static initialization of a field
  1865.                 // refers to another variable in the same type it must have appeared
  1866.                 // before the current field declaration otherwise we will emit an error
  1867.                 // message later...
  1868.                 //
  1869.                 if (variable_symbol -> IsDeclarationComplete())
  1870.                     field_access -> value = variable_symbol -> initial_value;
  1871.                 else if (variable_symbol -> declarator)
  1872.                 {
  1873.                     AstVariableDeclarator *declarator = variable_symbol -> declarator -> VariableDeclaratorCast();
  1874.                     //
  1875.                     // If the variable declarator in question exists and its computation is not
  1876.                     // pending (to avoid looping) and it has a simple expression initializer.
  1877.                     //
  1878.                     if (declarator && (! declarator -> pending) && 
  1879.                         declarator -> variable_initializer_opt &&
  1880.                         (! declarator -> variable_initializer_opt -> ArrayInitializerCast()))
  1881.                     {
  1882.                         TypeSymbol *variable_type = (TypeSymbol *) variable_symbol -> owner;
  1883.                         Semantic *sem = variable_type -> semantic_environment -> sem;
  1884.                         field_access -> value = sem -> ComputeFinalValue(declarator);
  1885.                     }
  1886.                 }
  1887.             }
  1888.  
  1889.             TypeSymbol *containing_type = (TypeSymbol *) variable_symbol -> owner;
  1890.             if (variable_symbol -> ACC_PRIVATE() && // access to an private variable in an enclosing type ?
  1891.                 this_type != containing_type && this_type -> outermost_type == containing_type -> outermost_type)
  1892.             {
  1893.                 if (field_access -> IsConstant())
  1894.                     field_access -> symbol = variable_symbol;
  1895.                 else
  1896.                 {
  1897.                     AstFieldAccess *method_access = compilation_unit -> ast_pool -> GenFieldAccess();
  1898.                     method_access -> base = field_access -> base;  // TODO: WARNING: sharing of Ast subtree !!!
  1899.                     method_access -> dot_token = field_access -> identifier_token;
  1900.                     method_access -> identifier_token = field_access -> identifier_token;
  1901.                     method_access -> symbol = variable_symbol; // the variable in question
  1902.  
  1903.                     AstMethodInvocation *p      = compilation_unit -> ast_pool -> GenMethodInvocation();
  1904.                     p -> method                  = method_access;
  1905.                     p -> left_parenthesis_token  = field_access -> identifier_token;
  1906.                     p -> right_parenthesis_token = field_access -> identifier_token;
  1907.                     p -> symbol                  = TypeSymbol::GetReadAccessMethod(variable_symbol);
  1908.  
  1909.                     field_access -> resolution_opt = p;
  1910.                     field_access -> symbol = p -> symbol;
  1911.                 }
  1912.             }
  1913.             else
  1914.             {
  1915.                 field_access -> symbol = variable_symbol;
  1916.                 MemberAccessCheck(field_access, type, containing_type, variable_symbol);
  1917.             }
  1918.         }
  1919.         else
  1920.         {
  1921.             TypeSymbol *inner_type;
  1922.             if (inner_type = FindNestedType(type, field_access -> identifier_token))
  1923.                  ReportSemError(SemanticError::FIELD_IS_TYPE,
  1924.                                 field_access -> identifier_token,
  1925.                                 field_access -> identifier_token,
  1926.                                 lex_stream -> Name(field_access -> identifier_token));
  1927.             else ReportAccessedFieldNotFound(field_access, type);
  1928.  
  1929.             field_access -> symbol = control.no_type;
  1930.         }
  1931.     }
  1932.  
  1933.     return;
  1934. }
  1935.  
  1936. //
  1937. // NOTE that method names are not processed here but by the function
  1938. // ProcessMethodName.
  1939. //
  1940. void Semantic::ProcessAmbiguousName(Ast *name)
  1941. {
  1942.     TypeSymbol *this_type = ThisType();
  1943.  
  1944.     AstSimpleName *simple_name;
  1945.  
  1946.     //
  1947.     // ...If the ambiguous name is a simple name,...
  1948.     //
  1949.     if (simple_name = name -> SimpleNameCast())
  1950.     {
  1951.         TypeSymbol *type;
  1952.         //
  1953.         // ... If the Identifier appears within the scope (6.3) if a local variable declaration (14.3)
  1954.         // or parameter declaration (8.4.1, 8.6.1, 14.18) with that name, then the ambiguous name is
  1955.         // reclassified as an ExpressionName...
  1956.         //
  1957.         // ...Otherwise, consider the class or interface C within whose declaration the Identifier occurs.
  1958.         // If C has one or more fields with that name, which may be either declared within it or inherited,
  1959.         // then the Ambiguous name is reclassified as an ExpressionName....
  1960.         //
  1961.         SemanticEnvironment *where_found;
  1962.         VariableSymbol *variable_symbol = FindVariableInEnvironment(where_found, state_stack.Top(), simple_name -> identifier_token);
  1963.         if (variable_symbol)
  1964.         {
  1965.             //
  1966.             // A variable_symbol that is FINAL may have an initial value.
  1967.             // If variable_symbol is not final then its initial value is NULL.
  1968.             //
  1969.             simple_name -> value = variable_symbol -> initial_value;
  1970.             simple_name -> symbol = variable_symbol;
  1971.  
  1972.             //
  1973.             // If the variable belongs to an outer type, add the proper
  1974.             // pointer dereferences (and method access in the case of a
  1975.             // private variable) necessary to  get to it.
  1976.             //
  1977.             if (where_found != state_stack.Top())
  1978.                 CreateAccessToScopedVariable(simple_name, where_found -> Type());
  1979.  
  1980.             if (StaticRegion())
  1981.             {
  1982.                 if (! (variable_symbol -> IsLocal() || variable_symbol -> ACC_STATIC()))
  1983.                 {
  1984.                     ReportSemError(SemanticError::NAME_NOT_CLASS_VARIABLE,
  1985.                                    simple_name -> identifier_token,
  1986.                                    simple_name -> identifier_token,
  1987.                                    lex_stream -> Name(simple_name -> identifier_token));
  1988.                 }
  1989.                 else if (! variable_symbol -> IsDeclarationComplete())
  1990.                 {
  1991.                     ReportSemError(SemanticError::NAME_NOT_YET_AVAILABLE,
  1992.                                    simple_name -> identifier_token,
  1993.                                    simple_name -> identifier_token,
  1994.                                    lex_stream -> Name(simple_name -> identifier_token));
  1995.                 }
  1996.             }
  1997.  
  1998.             if (ExplicitConstructorInvocation() && (! variable_symbol -> ACC_STATIC()))
  1999.             {
  2000.                 //
  2001.                 // If the variable in question is an instance variable
  2002.                 // that is declared in this_type (this_type is definitely
  2003.                 // a class) or one of its super classes, then we have an error -> 
  2004.                 //
  2005.                 TypeSymbol *type = variable_symbol -> owner -> TypeCast();
  2006.                 if (type)
  2007.                 {
  2008.                     ReportSemError(SemanticError::INSTANCE_VARIABLE_IN_EXPLICIT_CONSTRUCTOR_INVOCATION,
  2009.                                    simple_name -> identifier_token,
  2010.                                    simple_name -> identifier_token,
  2011.                                    lex_stream -> Name(simple_name -> identifier_token),
  2012.                                    type -> Name());
  2013.                 }
  2014.             }
  2015.         }
  2016.  
  2017.         //
  2018.         // ...Otherwise, if a type of that name is declared in the compilation unit (7.3) containing
  2019.         // the Identifier, either by a single-type-import declaration (7.5.1) or by a class or interface
  2020.         // type declaration (7.6), then the Ambiguous name is reclassified as a TypeName...
  2021.         //
  2022.         // ...Otherwise, if a type of that name is declared in another compilation unit (7.3) of the
  2023.         // package (7.1) of the compilation unit containing the Identifier, then the Ambiguous Name
  2024.         // is reclassified as a TypeName...
  2025.         //
  2026.         // ...Otherwise, if a type of that name is declared by exactly one type-import-on-demand declaration
  2027.         // (7.5.2) of the compilation unit containing the Identifier, then the AmbiguousName is reclassified
  2028.         // as a TypeName
  2029.         //
  2030.         // ...Otherwise, if a type of that name is declared by more than one type-import-on-demand declaration
  2031.         // of the compilation unit containing the Identifier, then a compile-time error results.
  2032.         //
  2033.         else if (type = FindType(simple_name -> identifier_token))
  2034.              simple_name -> symbol = type;
  2035.         //
  2036.         // ...Otherwise, the Ambiguous name is reclassified as a PackageName. A later step determines
  2037.         // whether or not a package of that name actually exists.
  2038.         //
  2039.         else
  2040.         {
  2041.             NameSymbol *name_symbol = (NameSymbol *) lex_stream -> NameSymbol(simple_name -> identifier_token);
  2042.             PackageSymbol *package = control.external_table.FindPackageSymbol(name_symbol);
  2043.             if (package)
  2044.                 simple_name -> symbol = package;
  2045.             else
  2046.             {
  2047.                 package = control.external_table.InsertPackageSymbol(name_symbol, NULL);
  2048.                 control.FindPathsToDirectory(package);
  2049.                 simple_name -> symbol = package;
  2050.             }
  2051.         }
  2052.     }
  2053.     //
  2054.     // ...If the ambiguous name is a qualified name,...
  2055.     //
  2056.     else
  2057.     {
  2058.         AstFieldAccess *field_access = (AstFieldAccess *) name;
  2059. assert(name -> FieldAccessCast());
  2060.         TypeSymbol *type = NULL;
  2061.  
  2062.         if (field_access -> IsClassAccess())
  2063.         {
  2064.             if (! control.option.one_one)
  2065.             {
  2066.                 ReportSemError(SemanticError::ONE_ONE_FEATURE,
  2067.                                field_access -> LeftToken(),
  2068.                                field_access -> RightToken());
  2069.             }
  2070.  
  2071.             AstTypeExpression *base = (AstTypeExpression *) field_access -> base;
  2072.  
  2073.             AstArrayType *array_type = base -> type -> ArrayTypeCast();
  2074.             if (array_type)
  2075.             {
  2076.                 AstPrimitiveType *primitive_type = array_type -> type -> PrimitiveTypeCast();
  2077.                 TypeSymbol *unit = (primitive_type ? FindPrimitiveType(primitive_type) : MustFindType(array_type -> type));
  2078.                 type = unit -> GetArrayType((Semantic *) this, array_type -> NumBrackets());
  2079.             }
  2080.             else
  2081.             {
  2082.                 AstPrimitiveType *primitive_type = base -> type -> PrimitiveTypeCast();
  2083.                 type = (primitive_type ? FindPrimitiveType(primitive_type) : MustFindType(base -> type));
  2084.             }
  2085.  
  2086.             TypeSymbol *outermost_type = this_type -> outermost_type;
  2087.  
  2088.             if (type -> Primitive())
  2089.             {
  2090.                 if (type == control.int_type)
  2091.                      type = control.Integer();
  2092.                 else if (type == control.double_type)
  2093.                      type = control.Double();
  2094.                 else if (type == control.char_type)
  2095.                      type = control.Character();
  2096.                 else if (type == control.long_type)
  2097.                      type = control.Long();
  2098.                 else if (type == control.float_type)
  2099.                      type = control.Float();
  2100.                 else if (type == control.byte_type)
  2101.                      type = control.Byte();
  2102.                 else if (type == control.short_type)
  2103.                      type = control.Short();
  2104.                 else if (type == control.boolean_type)
  2105.                      type = control.Boolean();
  2106.                 else // (type == control.void_type)
  2107.                      type = control.Void();
  2108.                 base -> symbol = type;
  2109.                 field_access -> symbol = type -> FindVariableSymbol(control.type_name_symbol);
  2110. assert(field_access -> symbol);
  2111.             }
  2112.             else
  2113.             {
  2114.                 base -> symbol = type;
  2115.  
  2116.                 if (outermost_type -> ACC_INTERFACE())
  2117.                 {
  2118.                     TypeSymbol *class_literal_type = outermost_type -> FindOrInsertClassLiteralClass(field_access -> identifier_token);
  2119.                     AddDependence(this_type, class_literal_type, field_access -> identifier_token);
  2120.  
  2121.                     AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(field_access -> identifier_token);
  2122.                     simple_name -> symbol = class_literal_type;
  2123.  
  2124.                     AstFieldAccess *method_access = compilation_unit -> ast_pool -> GenFieldAccess();
  2125.                     method_access -> base = simple_name;
  2126.                     method_access -> dot_token = field_access -> identifier_token;
  2127.                     method_access -> identifier_token = field_access -> identifier_token;
  2128.  
  2129.                     AstStringLiteral *string_literal = compilation_unit -> ast_pool -> GenStringLiteral(field_access -> identifier_token);
  2130.                     string_literal -> value = type -> FindOrInsertClassLiteralName(control);
  2131.                     string_literal -> symbol = control.String();
  2132.  
  2133.                     AstMethodInvocation *method_call       = compilation_unit -> ast_pool -> GenMethodInvocation();
  2134.                     method_call -> method                  = method_access;
  2135.                     method_call -> left_parenthesis_token  = field_access -> identifier_token;
  2136.                     method_call -> AddArgument(string_literal);
  2137.                     method_call -> right_parenthesis_token = field_access -> identifier_token;
  2138.                     method_call -> symbol                  = class_literal_type -> ClassLiteralMethod();
  2139.  
  2140.                     field_access -> resolution_opt = method_call;
  2141.                     field_access -> symbol = (method_call -> symbol ? method_call -> symbol : control.no_type);
  2142.                 }
  2143.                 else
  2144.                 {
  2145.                     AddDependence(this_type, control.Class(), field_access -> identifier_token);
  2146.  
  2147.                     VariableSymbol *variable_symbol = outermost_type -> FindOrInsertClassLiteral(type);
  2148.                     if (this_type == outermost_type)
  2149.                     {
  2150.                         AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(field_access -> identifier_token);
  2151.                         simple_name -> symbol = variable_symbol;
  2152.  
  2153.                         field_access -> symbol = variable_symbol;
  2154.                         field_access -> resolution_opt = simple_name;
  2155.                     }
  2156.                     else
  2157.                     {
  2158.                         AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(field_access -> identifier_token);
  2159.                         simple_name -> symbol = outermost_type;
  2160.  
  2161.                         AstFieldAccess *method_access = compilation_unit -> ast_pool -> GenFieldAccess();
  2162.                         method_access -> base = simple_name;
  2163.                         method_access -> dot_token = field_access -> identifier_token;
  2164.                         method_access -> identifier_token = field_access -> identifier_token;
  2165.                         method_access -> symbol = variable_symbol; // the variable in question
  2166.  
  2167.                         AstMethodInvocation *method_call       = compilation_unit -> ast_pool -> GenMethodInvocation();
  2168.                         method_call -> method                  = method_access;
  2169.                         method_call -> left_parenthesis_token  = field_access -> identifier_token;
  2170.                         method_call -> right_parenthesis_token = field_access -> identifier_token;
  2171.                         method_call -> symbol                  = TypeSymbol::GetWriteAccessMethod(variable_symbol);
  2172.  
  2173.                         field_access -> resolution_opt = method_call;
  2174.                         field_access -> symbol = TypeSymbol::GetReadAccessMethod(variable_symbol);
  2175.                     }
  2176.                 }
  2177.             }
  2178.         }
  2179.         else
  2180.         {
  2181.             AstExpression* base = field_access -> base;
  2182.             AstFieldAccess *sub_field_access = base -> FieldAccessCast();
  2183.             simple_name = base -> SimpleNameCast();
  2184.  
  2185.             //
  2186.             // ...First, classify the name or expression to the left of the '.'...
  2187.             //
  2188.             if (simple_name || sub_field_access)
  2189.                  ProcessAmbiguousName(base);
  2190.             else ProcessExpression(base);
  2191.  
  2192.             if (base -> symbol == control.no_type)
  2193.             {
  2194.                 field_access -> symbol = control.no_type;
  2195.                 return;
  2196.             }
  2197.  
  2198.             wchar_t *identifier_name = lex_stream -> Name(field_access -> identifier_token);
  2199.             PackageSymbol *package;
  2200.  
  2201.             Symbol *symbol = base -> symbol;
  2202.  
  2203.             if (field_access -> IsThisAccess() || field_access -> IsSuperAccess())
  2204.             {
  2205.                 if (! control.option.one_one)
  2206.                 {
  2207.                     ReportSemError(SemanticError::ONE_ONE_FEATURE,
  2208.                                    field_access -> LeftToken(),
  2209.                                    field_access -> RightToken());
  2210.                 }
  2211.  
  2212.                 TypeSymbol *enclosing_type = symbol -> TypeCast();
  2213.                 if (enclosing_type == control.no_type)
  2214.                     field_access -> symbol = control.no_type;
  2215.                 else
  2216.                 {
  2217.                     if (! enclosing_type)
  2218.                     {
  2219.                         ReportSemError(SemanticError::NOT_A_TYPE,
  2220.                                        field_access -> base -> LeftToken(),
  2221.                                        field_access -> base -> RightToken());
  2222.                         field_access -> symbol = control.no_type;
  2223.                     }
  2224.                     else if (enclosing_type -> ACC_INTERFACE())
  2225.                     {
  2226.                         ReportSemError(SemanticError::NOT_A_CLASS,
  2227.                                        field_access -> base -> LeftToken(),
  2228.                                        field_access -> base -> RightToken(),
  2229.                                        enclosing_type -> ContainingPackage() -> PackageName(),
  2230.                                        enclosing_type -> ExternalName());
  2231.                         field_access -> symbol = control.no_type;
  2232.                     }
  2233.                     else
  2234.                     {
  2235.                         if (! (this_type -> IsNestedIn(enclosing_type) && this_type -> CanAccess(enclosing_type)))
  2236.                         {
  2237.                             if (this_type == enclosing_type && field_access -> IsThisAccess())
  2238.                             {
  2239.                                 ReportSemError(SemanticError::MISPLACED_THIS_EXPRESSION,
  2240.                                                field_access -> LeftToken(),
  2241.                                                field_access -> RightToken());
  2242.                             }
  2243.                             else
  2244.                             {
  2245.                                 ReportSemError(SemanticError::ILLEGAL_THIS_FIELD_ACCESS,
  2246.                                                field_access -> LeftToken(),
  2247.                                                field_access -> RightToken(),
  2248.                                                enclosing_type -> ContainingPackage() -> PackageName(),
  2249.                                                enclosing_type -> ExternalName(),
  2250.                                                this_type -> ContainingPackage() -> PackageName(),
  2251.                                                this_type -> ExternalName());
  2252.                             }
  2253.  
  2254.                             field_access -> symbol = control.no_type;
  2255.                         }
  2256.                         else
  2257.                         {
  2258.                             //
  2259.                             // Note that in the case of a Super access, there will be further resolution later.
  2260.                             //
  2261.                             field_access -> resolution_opt = CreateAccessToType(field_access, enclosing_type);
  2262.                             field_access -> symbol = field_access -> resolution_opt -> symbol;
  2263.                         }
  2264.                     }
  2265.                 }
  2266.             }
  2267.             else if (package = symbol -> PackageCast())
  2268.             {
  2269.                 //
  2270.                 // ... If there is a package whose name is the name to the left of the '.' and that package
  2271.                 // contains a declaration of a type whose name is the same as the Identifier, then the
  2272.                 // AmbiguousName is reclassified as a TypeName...
  2273.                 //
  2274.                 NameSymbol *name_symbol = (NameSymbol *) lex_stream -> NameSymbol(field_access -> identifier_token);
  2275.                 type = package -> FindTypeSymbol(name_symbol);
  2276.  
  2277.                 if (type)
  2278.                 {
  2279.                     if (type -> SourcePending())
  2280.                         control.ProcessHeaders(type -> file_symbol);
  2281.                     field_access -> symbol = type;
  2282.                 }
  2283.                 else
  2284.                 {
  2285.                     FileSymbol *file_symbol = Control::GetFile(package, name_symbol, control.option.depend);
  2286.                     if (file_symbol)
  2287.                     {
  2288.                         type = ReadType(file_symbol, package, name_symbol, field_access -> identifier_token);
  2289.                         field_access -> symbol = type;
  2290.                     }
  2291.                     //
  2292.                     // ... Otherwise, this AmbiguousName is reclassified as a PackageName. A later step determines
  2293.                     // whether or not a package of that name actually exists...
  2294.                     //
  2295.                     else
  2296.                     {
  2297.                         PackageSymbol *subpackage = package -> FindPackageSymbol(name_symbol);
  2298.                         if (! subpackage) // A new package ?
  2299.                         {
  2300.                             subpackage = package -> InsertPackageSymbol(name_symbol);
  2301.                             control.FindPathsToDirectory(subpackage);
  2302.                         }
  2303.                         field_access -> symbol = subpackage;
  2304.                     }
  2305.                 }
  2306.             }
  2307.             else if (sub_field_access && sub_field_access -> IsSuperAccess())
  2308.             {
  2309.                 if (sub_field_access -> Type() == control.no_type)
  2310.                     field_access -> symbol = control.no_type;
  2311.                 else if (sub_field_access -> Type() == control.Object())
  2312.                 {
  2313.                     ReportSemError(SemanticError::OBJECT_HAS_NO_SUPER_TYPE,
  2314.                                    sub_field_access -> LeftToken(),
  2315.                                    sub_field_access -> RightToken(),
  2316.                                    sub_field_access -> Type() -> ContainingPackage() -> PackageName(),
  2317.                                    sub_field_access -> Type() -> ExternalName());
  2318.                     field_access -> symbol = control.no_type;
  2319.                 }
  2320.                 else
  2321.                 {
  2322.                     type = sub_field_access -> Type() -> super;
  2323.                     FindVariableMember(type, field_access);
  2324.                 }
  2325.             }
  2326.             //
  2327.             // ...If the name to the left of the '.' is reclassified as a TypeName, then this AmbiguousName is
  2328.             // reclassified as an ExpressionName
  2329.             //
  2330.             else if (type = symbol -> TypeCast())
  2331.             {
  2332.                 if (type -> Bad())
  2333.                 {
  2334.                     //
  2335.                     // If no error has been detected so far, report this as an error so that
  2336.                     // we don't try to generate code later. On the other hand, if an error
  2337.                     // had been detected prior to this, don't flood the user with spurious
  2338.                     // messages.
  2339.                     //
  2340.                     if (NumErrors() == 0)
  2341.                         ReportAccessedFieldNotFound(field_access, type);
  2342.                     field_access -> symbol = control.no_type;
  2343.                 }
  2344.                 else if (type == control.null_type || type -> Primitive())
  2345.                 {
  2346.                     ReportSemError(SemanticError::TYPE_NOT_REFERENCE,
  2347.                                    base -> LeftToken(),
  2348.                                    base -> RightToken(),
  2349.                                    type -> Name());
  2350.                     field_access -> symbol = control.no_type;
  2351.                 }
  2352.                 else
  2353.                 {
  2354.                     TypeAccessCheck(base, type);
  2355.  
  2356.                     VariableSymbol *variable_symbol = FindVariableInType(type, field_access);
  2357.  
  2358.                     if (variable_symbol)
  2359.                     {
  2360.                         if (base -> IsName()) // a type name (as opposed to an expression) ? 
  2361.                         {
  2362.                             if (variable_symbol -> ACC_STATIC())
  2363.                             {
  2364.                                 //
  2365.                                 // A variable_symbol that is STATIC and FINAL must have an initial value.
  2366.                                 // If it is dereferenced by a type name, then associate the value with the
  2367.                                 // subexpression to identify it as a constant subexpression.
  2368.                                 //
  2369.                                 if (variable_symbol -> ACC_FINAL())
  2370.                                 {
  2371.                                     //
  2372.                                     // If the field declaration of the type has been completely processed,
  2373.                                     // simply retrieve the value. Otherwise, compute the value of the
  2374.                                     // initialization expression in question on the fly if the variable
  2375.                                     // in question is not in the same type. Recall that static variables 
  2376.                                     // must be processed in the textual order in which they appear in the
  2377.                                     // body of a type. Therefore, if the static initialization of a field
  2378.                                     // refers to another variable in the same type it must have appeared
  2379.                                     // before the current field declaration otherwise we will emit an error
  2380.                                     // message later...
  2381.                                     //
  2382.                                     if (variable_symbol -> IsDeclarationComplete())
  2383.                                         field_access -> value = variable_symbol -> initial_value;
  2384.                                     else if (variable_symbol -> declarator)
  2385.                                     {
  2386.                                         AstVariableDeclarator *declarator = variable_symbol -> declarator -> VariableDeclaratorCast();
  2387.                                         //
  2388.                                         // If the variable declarator in question exists and its computation is not
  2389.                                         // pending (to avoid looping) and it has a simple expression initializer.
  2390.                                         //
  2391.                                         if (declarator &&
  2392.                                             (! declarator -> pending) && 
  2393.                                             declarator -> variable_initializer_opt &&
  2394.                                             (! declarator -> variable_initializer_opt -> ArrayInitializerCast()))
  2395.                                         {
  2396.                                             TypeSymbol *type = (TypeSymbol *) variable_symbol -> owner;
  2397.                                             Semantic *sem = type -> semantic_environment -> sem;
  2398.                                             field_access -> value = sem -> ComputeFinalValue(declarator);
  2399.                                         }
  2400.                                     }
  2401.                                 }
  2402.                             }
  2403.                             else
  2404.                             {
  2405.                                 ReportSemError(SemanticError::NAME_NOT_CLASS_VARIABLE,
  2406.                                                field_access -> identifier_token,
  2407.                                                field_access -> identifier_token,
  2408.                                                identifier_name);
  2409.                             }
  2410.                         }
  2411.  
  2412.                         TypeSymbol *containing_type = (TypeSymbol *) variable_symbol -> owner;
  2413.                         if (variable_symbol -> ACC_PRIVATE() &&
  2414.                             this_type != containing_type && this_type -> outermost_type == containing_type -> outermost_type)
  2415.                         {
  2416.                             if (field_access -> IsConstant())
  2417.                                 field_access -> symbol = variable_symbol;
  2418.                             else
  2419.                             {
  2420.                                 AstFieldAccess *method_access = compilation_unit -> ast_pool -> GenFieldAccess();
  2421.                                 method_access -> base = field_access -> base;  // TODO: WARNING: sharing of Ast subtree !!!
  2422.                                 method_access -> dot_token = field_access -> identifier_token;
  2423.                                 method_access -> identifier_token = field_access -> identifier_token;
  2424.                                 method_access -> symbol = variable_symbol; // the variable in question
  2425.  
  2426.                                 AstMethodInvocation *p      = compilation_unit -> ast_pool -> GenMethodInvocation();
  2427.                                 p -> method                  = method_access;
  2428.                                 p -> left_parenthesis_token  = field_access -> identifier_token;
  2429.                                 p -> right_parenthesis_token = field_access -> identifier_token;
  2430.                                 p -> symbol                  = TypeSymbol::GetReadAccessMethod(variable_symbol);
  2431.  
  2432.                                 field_access -> resolution_opt = p;
  2433.                                 field_access -> symbol = p -> symbol;
  2434.                             }
  2435.                         }
  2436.                         else
  2437.                         {
  2438.                             field_access -> symbol = variable_symbol;
  2439.                             MemberAccessCheck(field_access, type, containing_type, variable_symbol);
  2440.                         }
  2441.                     }
  2442.                     else 
  2443.                     {
  2444.                         TypeSymbol *inner_type = FindNestedType(type, field_access -> identifier_token);
  2445.                         if (inner_type)
  2446.                         {
  2447.                             field_access -> symbol = inner_type;
  2448.                             TypeAccessCheck(field_access, inner_type);
  2449.                         }
  2450.                         else
  2451.                         {
  2452.                             ReportAccessedFieldNotFound(field_access, type);
  2453.                             field_access -> symbol = control.no_type;
  2454.                         }
  2455.                     }
  2456.                 }
  2457.             }
  2458.             //
  2459.             // ...If the name to the left of the '.' is reclassified as an ExpressionName, then this
  2460.             // AmbiguousName is reclassified as an ExpressionName
  2461.             //
  2462.             else if (type = (TypeSymbol *)
  2463.                             (symbol -> VariableCast()
  2464.                                      ? symbol -> VariableCast() -> Type((Semantic *) this, field_access -> dot_token)
  2465.                                      : (symbol -> MethodCast()
  2466.                                                 ? symbol -> MethodCast() -> Type((Semantic *) this, field_access -> dot_token)
  2467.                                                 : NULL)))
  2468.             {
  2469.                 FindVariableMember(type, field_access);
  2470.             }
  2471.             else // illegal Name !!!
  2472.             {
  2473.                 ReportSemError(SemanticError::UNKNOWN_QUALIFIED_NAME_BASE,
  2474.                                base -> LeftToken(),
  2475.                                base -> RightToken(),
  2476.                                symbol -> Name());
  2477.                 field_access -> symbol = control.no_type;
  2478.             }
  2479.         }
  2480.  
  2481.         if (type)
  2482.         {
  2483.             TypeSymbol *parent_type = (type -> IsArray() ? type -> base_type : type);
  2484.             if (! parent_type -> Primitive())
  2485.                 AddDependence(this_type, parent_type, field_access -> identifier_token);
  2486.         }
  2487.     }
  2488.  
  2489.     return;
  2490. }
  2491.  
  2492.  
  2493. void Semantic::ProcessFieldAccess(Ast *expr)
  2494. {
  2495.     AstFieldAccess *field_access = (AstFieldAccess *) expr;
  2496.  
  2497.     ProcessAmbiguousName(field_access);
  2498.  
  2499.     if (field_access -> symbol != control.no_type)
  2500.     {
  2501.         PackageSymbol *package;
  2502.         TypeSymbol *type;
  2503.  
  2504.         if (package = field_access -> symbol -> PackageCast())
  2505.         {
  2506.             ReportSemError(SemanticError::UNKNOWN_AMBIGUOUS_NAME,
  2507.                            field_access -> LeftToken(),
  2508.                            field_access -> RightToken(),
  2509.                            package -> PackageName());
  2510.             field_access -> symbol = control.no_type;
  2511.         }
  2512.         else if ((type = field_access -> symbol -> TypeCast()) && (! field_access -> IsThisAccess()))
  2513.         {
  2514.             ReportSemError(SemanticError::TYPE_NOT_FIELD,
  2515.                            field_access -> LeftToken(),
  2516.                            field_access -> RightToken(),
  2517.                            type -> Name());
  2518.             field_access -> symbol = control.no_type;
  2519.         }
  2520.         else
  2521.         {
  2522.             VariableSymbol *variable = field_access -> symbol -> VariableCast();
  2523.             if (variable && (! variable -> IsTyped()))
  2524.                 variable -> ProcessVariableSignature((Semantic *) this, field_access -> identifier_token);
  2525.         }
  2526.     }
  2527.  
  2528.     return;
  2529. }
  2530.  
  2531.  
  2532. void Semantic::ProcessCharacterLiteral(Ast *expr)
  2533. {
  2534.     AstCharacterLiteral *char_literal = (AstCharacterLiteral *) expr;
  2535.  
  2536.     LiteralSymbol *literal = (LiteralSymbol *) lex_stream -> NameSymbol(char_literal -> character_literal_token);
  2537.  
  2538.     if (! literal -> value)
  2539.         control.int_pool.FindOrInsertChar(literal);
  2540.     if (literal -> value == &control.bad_value)
  2541.     {
  2542.         ReportSemError(SemanticError::INVALID_CHARACTER_VALUE,
  2543.                        char_literal -> LeftToken(),
  2544.                        char_literal -> RightToken());
  2545.         char_literal -> symbol = control.no_type;
  2546.     }
  2547.     else
  2548.     {
  2549.         char_literal -> value = literal -> value;
  2550.         char_literal -> symbol = control.char_type;
  2551.     }
  2552. }
  2553.  
  2554.  
  2555. void Semantic::ProcessIntegerLiteral(Ast *expr)
  2556. {
  2557.     AstIntegerLiteral *int_literal = (AstIntegerLiteral *) expr;
  2558.  
  2559.     LiteralSymbol *literal = (LiteralSymbol *) lex_stream -> NameSymbol(int_literal -> integer_literal_token);
  2560.  
  2561.     if (! literal -> value)
  2562.         control.int_pool.FindOrInsertInt(literal);
  2563.     if (literal -> value == &control.bad_value)
  2564.     {
  2565.         ReportSemError(SemanticError::INVALID_INT_VALUE,
  2566.                        int_literal -> LeftToken(),
  2567.                        int_literal -> RightToken());
  2568.         int_literal -> symbol = control.no_type;
  2569.     }
  2570.     else
  2571.     {
  2572.         int_literal -> value = literal -> value;
  2573.         int_literal -> symbol = control.int_type;
  2574.     }
  2575. }
  2576.  
  2577.  
  2578. void Semantic::ProcessLongLiteral(Ast *expr)
  2579. {
  2580.     AstLongLiteral *long_literal = (AstLongLiteral *) expr;
  2581.  
  2582.     LiteralSymbol *literal = (LiteralSymbol *) lex_stream -> NameSymbol(long_literal -> long_literal_token);
  2583.  
  2584.     if (! literal -> value)
  2585.         control.long_pool.FindOrInsertLong(literal);
  2586.     if (literal -> value == &control.bad_value)
  2587.     {
  2588.         ReportSemError(SemanticError::INVALID_LONG_VALUE,
  2589.                        long_literal -> LeftToken(),
  2590.                        long_literal -> RightToken());
  2591.         long_literal -> symbol = control.no_type;
  2592.     }
  2593.     else
  2594.     {
  2595.         long_literal -> value = literal -> value;
  2596.         long_literal -> symbol = control.long_type;
  2597.     }
  2598. }
  2599.  
  2600.  
  2601. void Semantic::ProcessFloatingPointLiteral(Ast *expr)
  2602. {
  2603.     AstFloatingPointLiteral *float_literal = (AstFloatingPointLiteral *) expr;
  2604.  
  2605.     LiteralSymbol *literal = (LiteralSymbol *) lex_stream -> NameSymbol(float_literal -> floating_point_literal_token);
  2606.  
  2607.     if (! literal -> value)
  2608.         control.float_pool.FindOrInsertFloat(literal);
  2609.     if (literal -> value == &control.bad_value)
  2610.     {
  2611.         ReportSemError(SemanticError::INVALID_FLOAT_VALUE,
  2612.                        float_literal -> LeftToken(),
  2613.                        float_literal -> RightToken());
  2614.         float_literal -> symbol = control.no_type;
  2615.     }
  2616.     else
  2617.     {
  2618.         float_literal -> value = literal -> value;
  2619.         float_literal -> symbol = control.float_type;
  2620.     }
  2621. }
  2622.  
  2623.  
  2624. void Semantic::ProcessDoubleLiteral(Ast *expr)
  2625. {
  2626.     AstDoubleLiteral *double_literal = (AstDoubleLiteral *) expr;
  2627.  
  2628.     LiteralSymbol *literal = (LiteralSymbol *) lex_stream -> NameSymbol(double_literal -> double_literal_token);
  2629.  
  2630.     if (! literal -> value)
  2631.         control.double_pool.FindOrInsertDouble(literal);
  2632.     if (literal -> value == &control.bad_value)
  2633.     {
  2634.         ReportSemError(SemanticError::INVALID_DOUBLE_VALUE,
  2635.                        double_literal -> LeftToken(),
  2636.                        double_literal -> RightToken());
  2637.         double_literal -> symbol = control.no_type;
  2638.     }
  2639.     else
  2640.     {
  2641.         double_literal -> value = literal -> value;
  2642.         double_literal -> symbol = control.double_type;
  2643.     }
  2644. }
  2645.  
  2646.  
  2647. void Semantic::ProcessTrueLiteral(Ast *expr)
  2648. {
  2649.     AstExpression *true_literal = (AstTrueLiteral *) expr;
  2650.  
  2651.     true_literal -> value = control.int_pool.FindOrInsert((int) 1);
  2652.     true_literal -> symbol = control.boolean_type;
  2653. }
  2654.  
  2655.  
  2656. void Semantic::ProcessFalseLiteral(Ast *expr)
  2657. {
  2658.     AstExpression *false_literal = (AstFalseLiteral *) expr;
  2659.  
  2660.     false_literal -> value = control.int_pool.FindOrInsert((int) 0);
  2661.     false_literal -> symbol = control.boolean_type;
  2662. }
  2663.  
  2664.  
  2665. void Semantic::ProcessStringLiteral(Ast *expr)
  2666. {
  2667.     AstStringLiteral *string_literal = (AstStringLiteral *) expr;
  2668.  
  2669.     LiteralSymbol *literal = (LiteralSymbol *) lex_stream -> NameSymbol(string_literal -> string_literal_token);
  2670.  
  2671.     if (! literal -> value)
  2672.         control.Utf8_pool.FindOrInsertString(literal);
  2673.     if (literal -> value == &control.bad_value)
  2674.     {
  2675.         ReportSemError(SemanticError::INVALID_STRING_VALUE,
  2676.                        string_literal -> LeftToken(),
  2677.                        string_literal -> RightToken());
  2678.         string_literal -> symbol = control.no_type;
  2679.     }
  2680.     else
  2681.     {
  2682.         string_literal -> value = literal -> value;
  2683.         string_literal -> symbol = control.String();
  2684.     }
  2685. }
  2686.  
  2687.  
  2688. void Semantic::ProcessArrayAccess(Ast *expr)
  2689. {
  2690.     AstArrayAccess *array_access = (AstArrayAccess *) expr;
  2691.  
  2692.     //
  2693.     // This operation may throw NullPointerException or IndefOutOfBoundsException
  2694.     //
  2695.     SymbolSet *exception_set = TryExceptionTableStack().Top();
  2696.     if (exception_set)
  2697.     {
  2698.         exception_set -> AddElement(control.RuntimeException());
  2699.         exception_set -> AddElement(control.Error());
  2700.     }
  2701.  
  2702.     ProcessExpression(array_access -> base);
  2703.     ProcessExpression(array_access -> expression);
  2704.     array_access -> expression = PromoteUnaryNumericExpression(array_access -> expression);
  2705.     if (array_access -> expression -> Type() != control.int_type && array_access -> expression -> symbol != control.no_type)
  2706.     {
  2707.         ReportSemError(SemanticError::TYPE_NOT_INTEGER,
  2708.                        array_access -> expression -> LeftToken(),
  2709.                        array_access -> expression -> RightToken(),
  2710.                        array_access -> expression -> Type() -> Name());
  2711.     }
  2712.  
  2713.     TypeSymbol *array_type = array_access -> base -> Type();
  2714.     if (array_type -> IsArray())
  2715.         array_access -> symbol = array_type -> ArraySubtype();
  2716.     else
  2717.     {
  2718.         if (array_type != control.no_type)
  2719.             ReportSemError(SemanticError::TYPE_NOT_ARRAY,
  2720.                            array_access -> base -> LeftToken(),
  2721.                            array_access -> base -> RightToken(),
  2722.                            array_access -> base -> Type() -> Name());
  2723.         array_access -> symbol = control.no_type;
  2724.     }
  2725.  
  2726.     return;
  2727. }
  2728.  
  2729.  
  2730. MethodSymbol *Semantic::FindMethodMember(TypeSymbol *type, AstMethodInvocation *method_call)
  2731. {
  2732.     MethodSymbol *method = NULL;
  2733.     AstFieldAccess *field_access = method_call -> method -> FieldAccessCast();
  2734.  
  2735.     if (type -> Bad())
  2736.     {
  2737.         //
  2738.         // If no error has been detected so far, report this as an error so that
  2739.         // we don't try to generate code later. On the other hand, if an error
  2740.         // had been detected prior to this, don't flood the user with spurious
  2741.         // messages.
  2742.         //
  2743.         if (NumErrors() == 0)
  2744.             ReportMethodNotFound(method_call, lex_stream -> Name(field_access -> identifier_token));
  2745.         method_call -> symbol = control.no_type;
  2746.     }
  2747.     else if (type == control.null_type || type -> Primitive())
  2748.     {
  2749.         ReportSemError(SemanticError::TYPE_NOT_REFERENCE,
  2750.                        field_access -> base -> LeftToken(),
  2751.                        field_access -> base -> RightToken(),
  2752.                        type -> Name());
  2753.         method_call -> symbol = control.no_type;
  2754.     }
  2755.     else
  2756.     {
  2757.         TypeSymbol *this_type = ThisType();
  2758.         TypeAccessCheck(field_access -> base, type);
  2759.  
  2760.         method = FindMethodInType(type, method_call);
  2761.  
  2762.         if (method)
  2763.         {
  2764.             if (method -> ACC_PRIVATE() && this_type != method -> containing_type
  2765.                                         && this_type -> outermost_type == method -> containing_type -> outermost_type)
  2766.                 method_call -> symbol = TypeSymbol::GetReadAccessMethod(method);
  2767.             else
  2768.             {
  2769.                 method_call -> symbol = method;
  2770.                 MemberAccessCheck(field_access, type, method -> containing_type, method);
  2771.             }
  2772.         }
  2773.         else method_call -> symbol = control.no_type;
  2774.     }
  2775.  
  2776.     return method;
  2777. }
  2778.  
  2779.  
  2780. void Semantic::ProcessMethodName(AstMethodInvocation *method_call)
  2781. {
  2782.     TypeSymbol *this_type = ThisType();
  2783.  
  2784.     //
  2785.     // This operation may throw:
  2786.     //
  2787.     //        OutOfMemoryError
  2788.     //        NoSuchMethodError
  2789.     //        IllegalAccessError
  2790.     //        IncompatibleClassChangeError
  2791.     //
  2792.     SymbolSet *exception_set = TryExceptionTableStack().Top();
  2793.     if (exception_set)
  2794.     {
  2795.         exception_set -> AddElement(control.RuntimeException());
  2796.         exception_set -> AddElement(control.Error());
  2797.     }
  2798.  
  2799.     AstSimpleName *simple_name;
  2800.  
  2801.     if (simple_name = method_call -> method -> SimpleNameCast())
  2802.     {
  2803.         SemanticEnvironment *where_found;
  2804.         MethodSymbol *method = FindMethodInEnvironment(where_found, state_stack.Top(), method_call);
  2805.  
  2806.         if (! method)
  2807.             method_call -> symbol = control.no_type;
  2808.         else
  2809.         {
  2810.             if (! method -> ACC_STATIC())
  2811.             {
  2812.                 //
  2813.                 // We are in a static region if we are:
  2814.                 //     . in the body of a static method
  2815.                 //     . in the body of a static initializer
  2816.                 //     . precessing an initializer expression for a static variable.
  2817.                 //
  2818.                 // See StaticRegion() Semantic.h for more detail.
  2819.                 //
  2820.                 // Note that a constructor is never static.
  2821.                 //
  2822.                 if (StaticRegion())
  2823.                 {
  2824.                     ReportSemError(SemanticError::METHOD_NOT_CLASS_METHOD,
  2825.                                    simple_name -> identifier_token,
  2826.                                    method_call -> right_parenthesis_token,
  2827.                                    lex_stream -> Name(simple_name -> identifier_token));
  2828.                 }
  2829.                 else if (ExplicitConstructorInvocation())
  2830.                 {
  2831.                     if (this_type -> IsSubclass(method -> containing_type))
  2832.                     {
  2833.                         //
  2834.                         // If the method in question is an instance method
  2835.                         // that is declared in this_type (this_type is definitely
  2836.                         // a class) or one of its super classes, then we have an error -> 
  2837.                         //
  2838.                         ReportSemError(SemanticError::INSTANCE_METHOD_IN_EXPLICIT_CONSTRUCTOR_INVOCATION,
  2839.                                        method_call -> LeftToken(),
  2840.                                        method_call -> RightToken(),
  2841.                                        method -> Header(),
  2842.                                        method -> containing_type -> Name());
  2843.                     }
  2844.                 }
  2845.             }
  2846.  
  2847.             method_call -> symbol = method;
  2848.  
  2849.             //
  2850.             // If the method is a private method belonging to an outer type,
  2851.             // give the ast simple_name access to its read_method.
  2852.             //
  2853.             if (where_found != state_stack.Top())
  2854.                 CreateAccessToScopedMethod(method_call, where_found -> Type());
  2855.         }
  2856.     }
  2857.     else
  2858.     {
  2859.         AstFieldAccess *field_access = method_call -> method -> FieldAccessCast();
  2860.         AstExpression* base = field_access -> base;
  2861.         AstFieldAccess *sub_field_access = base -> FieldAccessCast();
  2862.  
  2863.         if (base -> SimpleNameCast() || sub_field_access)
  2864.              ProcessAmbiguousName(base);
  2865.         else ProcessExpression(base);
  2866.  
  2867.         if (base -> symbol == control.no_type)
  2868.         {
  2869.             method_call -> symbol = control.no_type;
  2870.             return;
  2871.         }
  2872.  
  2873.         TypeSymbol *type = NULL;
  2874.         Symbol *symbol = base -> symbol;
  2875.  
  2876.         //
  2877.         // If the base is a "super" field access, resolve it before proceeding 
  2878.         //
  2879.         if (sub_field_access && sub_field_access -> IsSuperAccess())
  2880.         {
  2881.             if (sub_field_access -> Type() == control.no_type)
  2882.                 method_call -> symbol = control.no_type;
  2883.             else if (sub_field_access -> Type() == control.Object())
  2884.             {
  2885.                 ReportSemError(SemanticError::OBJECT_HAS_NO_SUPER_TYPE,
  2886.                                sub_field_access -> LeftToken(),
  2887.                                sub_field_access -> RightToken(),
  2888.                                sub_field_access -> Type() -> ContainingPackage() -> PackageName(),
  2889.                                sub_field_access -> Type() -> ExternalName());
  2890.                 method_call -> symbol = control.no_type;
  2891.             }
  2892.             else
  2893.             {
  2894.                 MethodSymbol *method = FindMethodMember(sub_field_access -> Type() -> super, method_call);
  2895.  
  2896.                 //
  2897.                 // TODO: This test was added in order to pass the test in section 8.4.3.1, page 159.
  2898.                 //       All I can find in the spec is that one example. Nowhere else could I find a
  2899.                 //       more formal statement.
  2900.                 //
  2901.                 if (method && method -> ACC_ABSTRACT())
  2902.                 {
  2903.                     ReportSemError(SemanticError::ABSTRACT_METHOD_INVOCATION,
  2904.                                    field_access -> LeftToken(),
  2905.                                    field_access -> identifier_token,
  2906.                                    lex_stream -> Name(field_access -> identifier_token));
  2907.                 }
  2908.             }
  2909.         }
  2910.         else if (type = symbol -> TypeCast())
  2911.         {
  2912.             if (type -> Bad())
  2913.             {
  2914.                 //
  2915.                 // If no error has been detected so far, report this as an error so that
  2916.                 // we don't try to generate code later. On the other hand, if an error
  2917.                 // had been detected prior to this, don't flood the user with spurious
  2918.                 // messages.
  2919.                 //
  2920.                 if (NumErrors() == 0)
  2921.                     ReportMethodNotFound(method_call, lex_stream -> Name(field_access -> identifier_token));
  2922.                 method_call -> symbol = control.no_type;
  2923.             }
  2924.             else if (type == control.null_type || type -> Primitive())
  2925.             {
  2926.                 ReportSemError(SemanticError::TYPE_NOT_REFERENCE,
  2927.                                base -> LeftToken(),
  2928.                                base -> RightToken(),
  2929.                                type -> Name());
  2930.                 method_call -> symbol = control.no_type;
  2931.             }
  2932.             else
  2933.             {
  2934.                 TypeAccessCheck(base, type);
  2935.  
  2936.                 MethodSymbol *method = FindMethodInType(type, method_call);
  2937.  
  2938.                 if (method)
  2939.                 {
  2940.                     if (base -> IsName() && (! method -> ACC_STATIC()))
  2941.                     {
  2942.                         ReportSemError(SemanticError::METHOD_NOT_CLASS_METHOD,
  2943.                                        field_access -> LeftToken(),
  2944.                                        field_access -> identifier_token,
  2945.                                        lex_stream -> Name(field_access -> identifier_token));
  2946.                     }
  2947.                     //
  2948.                     // TODO: This test was added in order to pass the test in section 8.4.3.1, page 159.
  2949.                     //       All I can find in the spec is that one example. Nowhere else could I find a
  2950.                     //       more formal statement.
  2951.                     //
  2952.                     else if (base -> SuperExpressionCast() && method -> ACC_ABSTRACT())
  2953.                         ReportSemError(SemanticError::ABSTRACT_METHOD_INVOCATION,
  2954.                                        field_access -> LeftToken(),
  2955.                                        field_access -> identifier_token,
  2956.                                        lex_stream -> Name(field_access -> identifier_token));
  2957.  
  2958.                     if (method -> ACC_PRIVATE() && this_type != method -> containing_type
  2959.                                                 && this_type -> outermost_type == method -> containing_type -> outermost_type)
  2960.                         method_call -> symbol = TypeSymbol::GetReadAccessMethod(method);
  2961.                     else
  2962.                     {
  2963.                         method_call -> symbol = method;
  2964.                         MemberAccessCheck(field_access, type, method -> containing_type, method);
  2965.                     }
  2966.                 }
  2967.                 else method_call -> symbol = control.no_type;
  2968.             }
  2969.         }
  2970.         else if (type = (TypeSymbol *)
  2971.                         (symbol -> VariableCast()
  2972.                                  ? symbol -> VariableCast() -> Type((Semantic *) this, field_access -> dot_token)
  2973.                                  : (symbol -> MethodCast()
  2974.                                             ? symbol -> MethodCast() -> Type((Semantic *) this, field_access -> dot_token)
  2975.                                             : NULL)))
  2976.         {
  2977.             (void) FindMethodMember(type, method_call);
  2978.         }
  2979.         else // illegal Name !!!
  2980.         {
  2981.             PackageSymbol *package = symbol -> PackageCast();
  2982.             NameSymbol *name_symbol = (NameSymbol *) lex_stream -> NameSymbol(field_access -> identifier_token);
  2983.  
  2984.             if (package && (package -> FindTypeSymbol(name_symbol) ||
  2985.                             Control::GetFile(package, name_symbol, control.option.depend)))
  2986.             {
  2987.                 ReportSemError(SemanticError::TYPE_NOT_METHOD,
  2988.                                method_call -> LeftToken(),
  2989.                                method_call -> RightToken(),
  2990.                                name_symbol -> Name());
  2991.             }
  2992.             else
  2993.             {
  2994.                 ReportSemError(SemanticError::UNKNOWN_QUALIFIED_NAME_BASE,
  2995.                                field_access -> base -> LeftToken(),
  2996.                                field_access -> base -> RightToken(),
  2997.                                symbol -> Name());
  2998.             }
  2999.             method_call -> symbol = control.no_type;
  3000.         }
  3001.  
  3002.         if (type)
  3003.         {
  3004.             TypeSymbol *parent_type = (type -> IsArray() ? type -> base_type : type);
  3005.             if (! parent_type -> Primitive())
  3006.                 AddDependence(this_type, parent_type, field_access -> identifier_token);
  3007.         }
  3008.     }
  3009.  
  3010.     if (method_call -> symbol != control.no_type)
  3011.     {
  3012.         MethodSymbol *method = (MethodSymbol *) method_call -> symbol;
  3013.  
  3014.         if (exception_set)
  3015.         {
  3016.             for (int i = method -> NumThrows((Semantic *) this, method_call -> method -> RightToken()) - 1; i >= 0; i--)
  3017.                 exception_set -> AddElement(method -> Throws(i));
  3018. // TODO: what to do?
  3019. //            if (! method -> ACC_STATIC())
  3020. //                exception_set -> AddElement(NullPointerException());
  3021. //            if (method -> ACC_NATIVE())
  3022. //                exception_set -> AddElement(control.UnsatisfiedLinkError());
  3023.         }
  3024.  
  3025.         for (int i = 0; i < method_call -> NumArguments(); i++)
  3026.         {
  3027.             AstExpression *expr = method_call -> Argument(i);
  3028.             if (expr -> Type() != method -> FormalParameter(i) -> Type())
  3029.                 method_call -> Argument(i) = ConvertToType(expr, method -> FormalParameter(i) -> Type());
  3030.         }
  3031.  
  3032.         //
  3033.         // Recall that an instance initializer in the body of an anonymous type can
  3034.         // throw any exception. The test below allows us to skip such blocks.
  3035.         //
  3036.         if (! (this_type -> Anonymous() && ThisMethod() && ThisMethod() -> Identity() == control.block_init_name_symbol))
  3037.         {
  3038.             for (int k = method -> NumThrows((Semantic *) this, method_call -> method -> RightToken()) - 1; k >= 0; k--)
  3039.             {
  3040.                 TypeSymbol *exception = method -> Throws(k);
  3041.                 if (! CatchableException(exception))
  3042.                 {
  3043.                     ReportSemError(SemanticError::UNCATCHABLE_METHOD_THROWN_CHECKED_EXCEPTION,
  3044.                                    method_call -> LeftToken(),
  3045.                                    method_call -> RightToken(),
  3046.                                    method -> Header(),
  3047.                                    exception -> ContainingPackage() -> PackageName(),
  3048.                                    exception -> ExternalName());
  3049.                 }
  3050.             }
  3051.         }
  3052.     }
  3053.  
  3054.     return;
  3055. }
  3056.  
  3057.  
  3058. void Semantic::ProcessMethodInvocation(Ast *expr)
  3059. {
  3060.     AstMethodInvocation *method_call = (AstMethodInvocation *) expr;
  3061.  
  3062.     bool no_bad_argument = true;
  3063.  
  3064.     for (int i = 0; i < method_call -> NumArguments(); i++)
  3065.     {
  3066.         AstExpression *expr = method_call -> Argument(i);
  3067.         ProcessExpression(expr); // TODO: ProcessExpressionOrStringConstant(expr);
  3068.         no_bad_argument = no_bad_argument && (expr -> symbol != control.no_type);
  3069.     }
  3070.  
  3071.     if (no_bad_argument)
  3072.     {
  3073.         ProcessMethodName(method_call);
  3074.         if (method_call -> symbol != control.no_type)
  3075.         {
  3076.             MethodSymbol *method = (MethodSymbol *) method_call -> symbol;
  3077.             if (! method -> IsTyped())
  3078.                 method -> ProcessMethodSignature((Semantic *) this, method_call -> left_parenthesis_token);
  3079.         }
  3080.     }
  3081.     else method_call -> symbol = control.no_type;
  3082.  
  3083.     return;
  3084. }
  3085.  
  3086.  
  3087. void Semantic::ProcessNullLiteral(Ast *expr)
  3088. {
  3089.     AstNullLiteral *null_literal = (AstNullLiteral *) expr;
  3090.     null_literal -> value = control.NullValue();
  3091.     null_literal -> symbol = control.null_type;
  3092.  
  3093.     return;
  3094. }
  3095.  
  3096.  
  3097. void Semantic::ProcessThisExpression(Ast *expr)
  3098. {
  3099.     AstThisExpression *this_expression = (AstThisExpression *) expr;
  3100.  
  3101.     if (StaticRegion())
  3102.     {
  3103.         ReportSemError(SemanticError::MISPLACED_THIS_EXPRESSION,
  3104.                        this_expression -> LeftToken(),
  3105.                        this_expression -> RightToken());
  3106.         this_expression -> symbol = control.no_type;
  3107.     }
  3108.     else if (ExplicitConstructorInvocation())
  3109.     {
  3110.         ReportSemError(SemanticError::THIS_IN_EXPLICIT_CONSTRUCTOR_INVOCATION,
  3111.                        this_expression -> LeftToken(),
  3112.                        this_expression -> RightToken(),
  3113.                        lex_stream -> Name(this_expression -> this_token));
  3114.         this_expression -> symbol = control.no_type;
  3115.     }
  3116.     else this_expression -> symbol = ThisType();
  3117.  
  3118.     return;
  3119. }
  3120.  
  3121.  
  3122. void Semantic::ProcessSuperExpression(Ast *expr)
  3123. {
  3124.     AstSuperExpression *super_expression = (AstSuperExpression *) expr;
  3125.  
  3126.     if (StaticRegion() || ThisType() == control.Object())
  3127.     {
  3128.          ReportSemError(SemanticError::MISPLACED_SUPER_EXPRESSION,
  3129.                         super_expression -> LeftToken(),
  3130.                         super_expression -> RightToken());
  3131.          super_expression -> symbol = control.no_type;
  3132.     }
  3133.     else if (ExplicitConstructorInvocation())
  3134.     {
  3135.         ReportSemError(SemanticError::THIS_IN_EXPLICIT_CONSTRUCTOR_INVOCATION,
  3136.                        super_expression -> LeftToken(),
  3137.                        super_expression -> RightToken(),
  3138.                        lex_stream -> Name(super_expression -> super_token));
  3139.          super_expression -> symbol = control.no_type;
  3140.     }
  3141.     else super_expression -> symbol = ThisType() -> super;
  3142. }
  3143.  
  3144.  
  3145. void Semantic::ProcessParenthesizedExpression(Ast *expr)
  3146. {
  3147.     AstParenthesizedExpression *parenthesized = (AstParenthesizedExpression *) expr;
  3148.  
  3149.     ProcessExpression(parenthesized -> expression);
  3150.     parenthesized -> value = parenthesized -> expression -> value;
  3151.     parenthesized -> symbol = parenthesized -> expression -> symbol;
  3152. }              
  3153.  
  3154.  
  3155. void Semantic::UpdateGeneratedLocalConstructor(MethodSymbol *constructor)
  3156. {
  3157.     TypeSymbol *local_type = constructor -> containing_type;
  3158.     MethodSymbol *local_constructor = constructor -> LocalConstructor();
  3159. assert(local_constructor -> IsGeneratedLocalConstructor());
  3160.     BlockSymbol *block_symbol = local_constructor -> block_symbol;
  3161.  
  3162.     for (int i = 0; i < constructor -> NumFormalParameters(); i++)
  3163.     {
  3164.         VariableSymbol *param = constructor -> FormalParameter(i),
  3165.                        *symbol = block_symbol -> FindVariableSymbol(param -> Identity());
  3166. assert(symbol);
  3167.         symbol -> SetExternalIdentity(param -> ExternalIdentity()); // TODO: do we really need this ?
  3168.         symbol -> SetLocalVariableIndex(block_symbol -> max_variable_index++);
  3169.         if (symbol -> Type() == control.long_type || symbol -> Type() == control.double_type)
  3170.             block_symbol -> max_variable_index++;
  3171.         local_constructor -> AddFormalParameter(symbol);
  3172.     }
  3173.  
  3174.     //
  3175.     // If we are dealing with a constructor generated for an anonymous type and
  3176.     // the super type of the anonymous type is an inner type then the generated
  3177.     // constructor accepts an additional formal parameter which is the containing
  3178.     // type of the super type, and the name of the parameter is #0.
  3179.     //
  3180.     VariableSymbol *super_this0_variable = block_symbol -> FindVariableSymbol(control.MakeParameter(0));
  3181.     if (super_this0_variable)
  3182.     {
  3183.         super_this0_variable -> SetLocalVariableIndex(block_symbol -> max_variable_index++);
  3184.         local_constructor -> AddFormalParameter(super_this0_variable);
  3185.     }
  3186.     local_constructor -> SetSignature(control);
  3187.  
  3188.     //
  3189.     //
  3190.     //
  3191.     AstConstructorDeclaration *constructor_declaration = (AstConstructorDeclaration *)
  3192.                                                           constructor -> method_or_constructor_declaration;
  3193. assert(constructor_declaration -> ConstructorDeclarationCast());
  3194.     AstConstructorBlock *constructor_block = constructor_declaration -> constructor_body;
  3195.  
  3196.     if (! (constructor_block -> explicit_constructor_invocation_opt &&
  3197.            constructor_block -> explicit_constructor_invocation_opt -> ThisCallCast()))
  3198.     {
  3199.         constructor_block -> AllocateLocalInitStatements(local_type -> NumConstructorParameters());
  3200.  
  3201.         //
  3202.         // Generate an assignment statement for each local variable parameter.
  3203.         // Note that we do not initialize the this$0 here as the real constructor
  3204.         // will do that. If the local_type is static, its constructor_parameters
  3205.         // list does not start with this$0.
  3206.         //
  3207.         for (int i = (local_type -> ACC_STATIC() ? 0 : 1); i < local_type -> NumConstructorParameters(); i++)
  3208.         {
  3209.             VariableSymbol *param = local_type -> ConstructorParameter(i),
  3210.                            *symbol = block_symbol -> FindVariableSymbol(param -> Identity());
  3211. assert(symbol);
  3212.             AstSimpleName *lhs = compilation_unit -> ast_pool -> GenSimpleName(constructor_block -> left_brace_token);
  3213.             lhs -> symbol = param;
  3214.  
  3215.             AstSimpleName *rhs = compilation_unit -> ast_pool -> GenSimpleName(constructor_block -> left_brace_token);
  3216.             rhs -> symbol = symbol;
  3217.  
  3218.             AstAssignmentExpression *assign = compilation_unit -> ast_pool
  3219.                                                                 -> GenAssignmentExpression(AstAssignmentExpression::EQUAL,
  3220.                                                                                             constructor_block -> left_brace_token);
  3221.             assign -> left_hand_side = lhs;
  3222.             assign -> expression     = rhs;
  3223.             assign -> symbol         = lhs -> Type();
  3224.  
  3225.             AstExpressionStatement *stmt = compilation_unit -> ast_pool -> GenExpressionStatement();
  3226.             stmt -> expression          = assign;
  3227.             stmt -> semicolon_token_opt = constructor_block -> left_brace_token;
  3228.  
  3229.             stmt -> is_reachable = true;
  3230.             stmt -> can_complete_normally = true;
  3231.  
  3232.             constructor_block -> AddLocalInitStatement(stmt);
  3233.         }
  3234.     }
  3235.  
  3236.     //
  3237.     //
  3238.     //
  3239.     AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(constructor_block -> left_brace_token);
  3240.     simple_name -> symbol = constructor;
  3241. assert(! constructor -> IsGeneratedLocalConstructor());
  3242.  
  3243.     AstMethodInvocation *method_call = compilation_unit -> ast_pool -> GenMethodInvocation();
  3244.     method_call -> method                  = simple_name;
  3245.     method_call -> left_parenthesis_token  = constructor_block -> left_brace_token;
  3246.     method_call -> right_parenthesis_token = constructor_block -> left_brace_token;
  3247.     method_call -> symbol                  = simple_name -> symbol;
  3248.  
  3249.     method_call -> AllocateArguments(constructor -> NumFormalParameters() + 1);
  3250.     if (! local_type -> ACC_STATIC())
  3251.     {
  3252.         AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(constructor_block -> left_brace_token);
  3253.         simple_name -> symbol = block_symbol -> FindVariableSymbol(control.this0_name_symbol);
  3254. assert(simple_name -> symbol);
  3255.         method_call -> AddArgument(simple_name);
  3256.     }
  3257.  
  3258.     for (int k = 0; k < constructor -> NumFormalParameters(); k++)
  3259.     {
  3260.         VariableSymbol *param = constructor -> FormalParameter(k),
  3261.                        *symbol = block_symbol -> FindVariableSymbol(param -> Identity());
  3262.         AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(constructor_block -> left_brace_token);
  3263.         simple_name -> symbol = symbol;
  3264.         method_call -> AddArgument(simple_name);
  3265.     }
  3266.  
  3267.     AstExpressionStatement *stmt = compilation_unit -> ast_pool -> GenExpressionStatement();
  3268.     stmt -> expression          = method_call;
  3269.     stmt -> semicolon_token_opt = constructor_block -> left_brace_token;
  3270.  
  3271.     stmt -> is_reachable = true;
  3272.     stmt -> can_complete_normally = true;
  3273.  
  3274.     constructor_block -> original_constructor_invocation = stmt;
  3275.  
  3276.     return;
  3277. }
  3278.  
  3279.  
  3280. void Semantic::UpdateLocalConstructors(TypeSymbol *inner_type)
  3281. {
  3282.     if (! ThisType() -> IsLocal()) // the method containing inner_type is not itself embedded in another method
  3283.     {
  3284.         //
  3285.         // Compute the set of local_classes we need to process here - they are
  3286.         // the inner_type itself and all the classes that are embedded in its body.
  3287.         //
  3288.         Tuple<TypeSymbol *> local_classes(8);
  3289.  
  3290.         TypeSymbol *outermost_type = inner_type -> outermost_type;
  3291.         if (outermost_type -> local) // The set of local types in the outermost type is not empty?
  3292.         {
  3293.             for (TypeSymbol *local_type = (TypeSymbol *) outermost_type -> local -> FirstElement();
  3294.                              local_type;
  3295.                              local_type = (TypeSymbol *) outermost_type -> local -> NextElement())
  3296.             {
  3297.                 if (local_type -> CanAccess(inner_type))
  3298.                     local_classes.Next() = local_type;
  3299.             }
  3300.         }
  3301.  
  3302.         for (int j = 0; j < outermost_type -> num_anonymous_types(); j++)
  3303.         {
  3304.             if (outermost_type -> AnonymousType(j) -> CanAccess(inner_type))
  3305.                 local_classes.Next() = outermost_type -> AnonymousType(j);
  3306.         }
  3307.  
  3308.         //
  3309.         // We now update each type T2 containing a call to a constructor of
  3310.         // T1 to make sure that T2 has a copy of or access to all the local
  3311.         // variables required by T1.
  3312.         //
  3313.         for (int k = 0; k < local_classes.Length(); k++)
  3314.         {
  3315.             TypeSymbol *target_local_type = local_classes[k];
  3316.  
  3317.             for (int i = 0; i < target_local_type -> NumLocalConstructorCallEnvironments(); i++)
  3318.             {
  3319.                 SemanticEnvironment *env = target_local_type -> LocalConstructorCallEnvironment(i);
  3320.                 TypeSymbol *source_local_type = env -> Type();
  3321.                 if (! source_local_type -> CanAccess(target_local_type))
  3322.                 {
  3323.                     for (int j = (target_local_type -> ACC_STATIC() ? 0 : 1);
  3324.                          j < target_local_type -> NumConstructorParameters(); j++)
  3325.                     {
  3326.                         VariableSymbol *local = target_local_type -> ConstructorParameter(j) -> accessed_local;
  3327.                         if (env -> symbol_table.FindVariableSymbol(local -> Identity()) != local)
  3328.                             source_local_type -> FindOrInsertLocalShadow(local);
  3329.                     }
  3330.                 }
  3331.             }
  3332.         }
  3333.  
  3334.         //
  3335.         // Now update the constructor bodies to reflect the new local variable counts and mark the local_type completed.
  3336.         //
  3337.         for (int l = 0; l < local_classes.Length(); l++)
  3338.         {
  3339.             TypeSymbol *local_type = local_classes[l];
  3340.  
  3341.             AstClassDeclaration *class_declaration = local_type -> declaration -> ClassDeclarationCast();
  3342.             AstClassInstanceCreationExpression *class_creation = local_type -> declaration -> ClassInstanceCreationExpressionCast();
  3343. assert(class_declaration || class_creation);
  3344.             AstClassBody *class_body = (class_declaration ? class_declaration -> class_body : class_creation -> class_body_opt);
  3345.  
  3346.             if (class_body -> default_constructor)
  3347.                  UpdateGeneratedLocalConstructor(class_body -> default_constructor -> constructor_symbol);
  3348.             else
  3349.             {
  3350.                 for (int i = 0; i < class_body -> NumConstructors(); i++)
  3351.                     UpdateGeneratedLocalConstructor(class_body -> Constructor(i) -> constructor_symbol);
  3352.  
  3353.                 for (int k = 0; k < local_type -> NumPrivateAccessConstructors(); k++)
  3354.                     UpdateGeneratedLocalConstructor(local_type -> PrivateAccessConstructor(k));
  3355.             }
  3356.  
  3357.             local_type -> MarkLocalClassProcessingCompleted();
  3358.         }
  3359.  
  3360.         //
  3361.         // Now update the constructor calls
  3362.         //
  3363.         for (int m = 0; m < local_classes.Length(); m++)
  3364.         {
  3365.             TypeSymbol *target_local_type = local_classes[m];
  3366. assert(target_local_type -> LocalClassProcessingCompleted());
  3367.  
  3368.             for (int i = 0; i < target_local_type -> NumLocalConstructorCallEnvironments(); i++)
  3369.             {
  3370.                 Ast *call = target_local_type -> LocalConstructorCallEnvironment(i) -> ast_construct;
  3371.                 SemanticEnvironment *env = target_local_type -> LocalConstructorCallEnvironment(i);
  3372.                 TypeSymbol *source_local_type = env -> Type();
  3373.  
  3374.                 AstClassInstanceCreationExpression *class_creation;
  3375.                 AstSuperCall *super_call;
  3376.                 AstThisCall *this_call;
  3377.  
  3378.                 if (class_creation = call -> ClassInstanceCreationExpressionCast())
  3379.                 {
  3380.                     if (class_creation -> symbol != control.no_type)
  3381.                     {
  3382.                         if (source_local_type -> CanAccess(target_local_type))
  3383.                         {
  3384.                             for (int j = (target_local_type -> ACC_STATIC() ? 0 : 1);
  3385.                                  j < target_local_type -> NumConstructorParameters(); j++)
  3386.                             {
  3387.                                 VariableSymbol *local = target_local_type -> ConstructorParameter(j) -> accessed_local;
  3388.                                 AstSimpleName *simple_name = compilation_unit -> ast_pool
  3389.                                                                                -> GenSimpleName(class_creation -> new_token);
  3390.                                 simple_name -> symbol = local;
  3391.                                 if (source_local_type != target_local_type)
  3392.                                 {
  3393.                                     state_stack.Push(source_local_type -> semantic_environment);
  3394.                                     CreateAccessToScopedVariable(simple_name, target_local_type);
  3395.                                     state_stack.Pop();
  3396.                                 }
  3397.                                 class_creation -> AddLocalArgument(simple_name);
  3398.                             }
  3399.                         }
  3400.                         else
  3401.                         {
  3402.                             for (int j = (target_local_type -> ACC_STATIC() ? 0 : 1);
  3403.                                  j < target_local_type -> NumConstructorParameters(); j++)
  3404.                             {
  3405.                                 VariableSymbol *local = target_local_type -> ConstructorParameter(j) -> accessed_local;
  3406.  
  3407.                                 AstSimpleName *simple_name = compilation_unit -> ast_pool
  3408.                                                                                -> GenSimpleName(class_creation -> new_token);
  3409.                                 simple_name -> symbol = (env -> symbol_table.FindVariableSymbol(local -> Identity()) == local
  3410.                                                               ? local
  3411.                                                               : source_local_type -> FindOrInsertLocalShadow(local));
  3412. assert(simple_name -> symbol -> VariableCast());
  3413.                                 class_creation -> AddLocalArgument(simple_name);
  3414.                             }
  3415.                         }
  3416.  
  3417.                         MethodSymbol *constructor = (MethodSymbol *) class_creation -> class_type -> symbol;
  3418. assert(constructor);
  3419. assert(constructor -> MethodCast());
  3420. assert(! constructor -> IsGeneratedLocalConstructor());
  3421. assert(constructor -> LocalConstructor());
  3422.                         class_creation -> class_type -> symbol = constructor -> LocalConstructor();
  3423.                     }
  3424.                 }
  3425.                 else if (super_call = call -> SuperCallCast())
  3426.                 {
  3427.                     if (super_call -> symbol -> MethodCast())
  3428.                     {
  3429.                         for (int j = (target_local_type -> ACC_STATIC() ? 0 : 1);
  3430.                              j < target_local_type -> NumConstructorParameters(); j++)
  3431.                         {
  3432.                             VariableSymbol *local = target_local_type -> ConstructorParameter(j) -> accessed_local;
  3433.  
  3434.                             AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(super_call -> super_token);
  3435.                             simple_name -> symbol = env -> symbol_table.FindVariableSymbol(local -> Identity());
  3436. assert(simple_name -> symbol -> VariableCast()); 
  3437.                             super_call -> AddLocalArgument(simple_name);
  3438.                         }
  3439.  
  3440.                         MethodSymbol *constructor = (MethodSymbol *) super_call -> symbol;
  3441. assert(constructor -> MethodCast() && (! constructor -> IsGeneratedLocalConstructor()));
  3442. assert(constructor -> LocalConstructor());
  3443.                         super_call -> symbol = constructor -> LocalConstructor();
  3444.                     }
  3445.                 }
  3446.                 else
  3447.                 {
  3448.                     this_call = (AstThisCall *) call;
  3449. assert(this_call -> ThisCallCast());
  3450.  
  3451.                     if (this_call -> symbol -> MethodCast())
  3452.                     {
  3453.                         for (int j = (target_local_type -> ACC_STATIC() ? 0 : 1);
  3454.                              j < target_local_type -> NumConstructorParameters(); j++)
  3455.                         {
  3456.                             VariableSymbol *local = target_local_type -> ConstructorParameter(j) -> accessed_local;
  3457.  
  3458.                             AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(this_call -> this_token);
  3459.                             simple_name -> symbol = env -> symbol_table.FindVariableSymbol(local -> Identity());
  3460. assert(simple_name -> symbol -> VariableCast()); 
  3461.                             this_call -> AddLocalArgument(simple_name);
  3462.                         }
  3463.  
  3464.                         MethodSymbol *constructor = (MethodSymbol *) this_call -> symbol;
  3465. assert(constructor -> MethodCast() && (! constructor -> IsGeneratedLocalConstructor()));
  3466. assert(constructor -> LocalConstructor());
  3467.                         this_call -> symbol = constructor -> LocalConstructor();
  3468.                     }
  3469.                 }
  3470.             }
  3471.         }
  3472.     }
  3473.  
  3474.     return;
  3475. }
  3476.  
  3477.  
  3478. void Semantic::GetAnonymousConstructor(AstClassInstanceCreationExpression *class_creation, TypeSymbol *anonymous_type)
  3479. {
  3480.     LexStream::TokenIndex left_loc  = class_creation -> class_type -> LeftToken(),
  3481.                           right_loc = class_creation -> right_parenthesis_token;
  3482.  
  3483.     TypeSymbol *super_type = anonymous_type -> super;
  3484.     MethodSymbol *super_constructor = FindConstructor(super_type, class_creation, left_loc, right_loc);
  3485.     if (! super_constructor)
  3486.     {
  3487.         class_creation -> class_type -> symbol = control.no_type;
  3488.         return;
  3489.     }
  3490.  
  3491.     //
  3492.     // Make constructor symbol. The associated symbol table will not contain too many elements...
  3493.     //
  3494.     BlockSymbol *block_symbol = new BlockSymbol(super_constructor -> NumFormalParameters() + 3);
  3495.     block_symbol -> max_variable_index = 1; // All types need a spot for "this".
  3496.  
  3497.     MethodSymbol *constructor = anonymous_type -> InsertConstructorSymbol(control.init_name_symbol);
  3498.     constructor -> SetType(control.void_type);
  3499.     constructor -> SetContainingType(anonymous_type);
  3500.     constructor -> SetBlockSymbol(block_symbol);
  3501.     constructor -> SetACC_PUBLIC();
  3502.  
  3503.     //
  3504.     // Report error is super constructor has throws clause, but add the exceptions to the local throws
  3505.     // clause to avoid spurious errors later !!!
  3506.     //
  3507.     int num_throws = super_constructor -> NumThrows((Semantic *) this, left_loc);
  3508.     if (num_throws > 0)
  3509.     {
  3510.         for (int i = 0; i < num_throws; i++)
  3511.         {
  3512.             TypeSymbol *exception = super_constructor -> Throws(i);
  3513.             ReportSemError(SemanticError::CONSTRUCTOR_DOES_NOT_THROW_SUPER_EXCEPTION,
  3514.                           class_creation -> new_token,
  3515.                           class_creation -> RightToken(),
  3516.                           StringConstant::US_EMPTY,
  3517.                           exception -> ContainingPackage() -> PackageName(),
  3518.                           exception -> ExternalName(),
  3519.                           super_constructor -> containing_type -> ContainingPackage() -> PackageName(),
  3520.                           super_constructor -> containing_type -> ExternalName());
  3521.  
  3522.             constructor -> AddThrows(exception);
  3523.         }
  3524.     }
  3525.  
  3526.     VariableSymbol *this0_variable = NULL;
  3527.     if (anonymous_type -> IsInner())
  3528.     {
  3529.         this0_variable = block_symbol -> InsertVariableSymbol(control.this0_name_symbol);
  3530.         this0_variable -> MarkSynthetic();
  3531.         this0_variable -> SetType(anonymous_type -> ContainingType());
  3532.         this0_variable -> SetOwner(constructor);
  3533.         this0_variable -> SetLocalVariableIndex(block_symbol -> max_variable_index++);
  3534.     }
  3535.  
  3536.     for (int j = 0; j < super_constructor -> NumFormalParameters(); j++)
  3537.     {
  3538.         VariableSymbol *param = super_constructor -> FormalParameter(j),
  3539.                        *symbol = block_symbol -> InsertVariableSymbol(param -> Identity());
  3540.         symbol -> SetType(param -> Type());
  3541.         symbol -> SetOwner(constructor);
  3542.         symbol -> SetLocalVariableIndex(block_symbol -> max_variable_index++);
  3543.         if (symbol -> Type() == control.long_type || symbol -> Type() == control.double_type)
  3544.             block_symbol -> max_variable_index++;
  3545.         constructor -> AddFormalParameter(symbol);
  3546.     }
  3547.  
  3548.     //
  3549.     //
  3550.     //
  3551.     AstSuperCall *super_call             = compilation_unit -> ast_pool -> GenSuperCall();
  3552.     super_call -> base_opt                = class_creation -> base_opt; // save initial base_opt
  3553.     super_call -> dot_token_opt           = class_creation -> new_token;
  3554.     super_call -> super_token             = class_creation -> new_token;
  3555.     super_call -> left_parenthesis_token  = class_creation -> new_token;
  3556.     super_call -> right_parenthesis_token = class_creation -> new_token;
  3557.     super_call -> semicolon_token         = class_creation -> new_token;
  3558.  
  3559.     super_call -> is_reachable            = true;
  3560.     super_call -> can_complete_normally   = true;
  3561.     super_call -> symbol                  = super_constructor;
  3562.  
  3563.     //
  3564.     // If it is in a static region, the anonymous class does not need a this$0 argument
  3565.     //
  3566.     class_creation -> base_opt = (anonymous_type -> ACC_STATIC()
  3567.                                            ? (AstExpression *) NULL
  3568.                                            : CreateAccessToType(class_creation, anonymous_type -> ContainingType()));
  3569.  
  3570.     AstClassBody *class_body = class_creation -> class_body_opt;
  3571.  
  3572.     AstReturnStatement *return_statement = compilation_unit -> ast_pool -> GenReturnStatement();
  3573.     return_statement -> return_token = class_body -> left_brace_token;
  3574.     return_statement -> expression_opt = NULL;
  3575.     return_statement -> semicolon_token = class_body -> left_brace_token;
  3576.     return_statement -> is_reachable = true;
  3577.  
  3578.     AstBlock *block = compilation_unit -> ast_pool -> GenBlock();
  3579.     block -> block_symbol = constructor -> block_symbol -> InsertBlockSymbol(1); // this symbol table will be empty
  3580.     block -> AllocateBlockStatements(1); // this block contains one statement
  3581.     block -> left_brace_token  = class_body -> left_brace_token;
  3582.     block -> right_brace_token = class_body -> left_brace_token;
  3583.  
  3584.     block -> is_reachable = true;
  3585.     block -> can_complete_normally = false;
  3586.     block -> AddStatement(return_statement);
  3587.  
  3588.     AstConstructorBlock *constructor_block                  = compilation_unit -> ast_pool -> GenConstructorBlock();
  3589.     constructor_block -> left_brace_token                    = class_body -> left_brace_token;
  3590.     constructor_block -> explicit_constructor_invocation_opt = super_call;
  3591.     constructor_block -> block                               = block;
  3592.     constructor_block -> right_brace_token                   = class_body -> left_brace_token;
  3593.  
  3594.     AstMethodDeclarator *method_declarator      = compilation_unit -> ast_pool -> GenMethodDeclarator();
  3595.     method_declarator -> identifier_token        = left_loc;
  3596.     method_declarator -> left_parenthesis_token  = class_creation -> left_parenthesis_token;
  3597.     method_declarator -> right_parenthesis_token = right_loc;
  3598.  
  3599.     AstConstructorDeclaration *constructor_declaration = compilation_unit -> ast_pool -> GenConstructorDeclaration();
  3600.     constructor_declaration -> constructor_declarator   = method_declarator;
  3601.     constructor_declaration -> constructor_body         = constructor_block;
  3602.  
  3603.     constructor_declaration -> constructor_symbol = constructor;
  3604.     constructor -> method_or_constructor_declaration = constructor_declaration;
  3605.  
  3606.     //
  3607.     // Note that the constructor for the anonymous type is not added to the class body here
  3608.     // beacause we've already completely compiled it and the arguments to its super call
  3609.     // do not contain "valid" SimpleName Ast expressions. It is added to the constructor
  3610.     // body later in get_anonymous_type...
  3611.     //
  3612.     // class_body -> default_constructor = constructor_declaration;
  3613.     //
  3614.     VariableSymbol *super_this0_variable = NULL;
  3615.  
  3616.     if (anonymous_type -> IsLocal())
  3617.     {
  3618.         GenerateLocalConstructor(constructor);
  3619.  
  3620.         MethodSymbol *generated_constructor = constructor -> LocalConstructor();
  3621. assert(! constructor -> IsGeneratedLocalConstructor());
  3622. assert(generated_constructor);
  3623.         block_symbol = generated_constructor -> block_symbol; // use the environment of the generated constructor...
  3624.  
  3625.         if (super_call -> base_opt)
  3626.         {
  3627.             //
  3628.             // Add the this$0 parameter for the super type. However, only mark it complete and
  3629.             // do not yet assign a number to it. This will be done after we know
  3630.             // how many extra "local" variable shadows are needed. See UpdateGeneratedLocalConstructor
  3631.             //
  3632.             super_this0_variable = block_symbol -> InsertVariableSymbol(control.MakeParameter(0));
  3633.             super_this0_variable -> MarkSynthetic();
  3634.             super_this0_variable -> SetType(super_call -> base_opt -> Type());
  3635.             super_this0_variable -> SetOwner(generated_constructor);
  3636.             super_this0_variable -> MarkComplete();
  3637.         }
  3638.  
  3639.         if (super_type -> IsLocal()) // a local type may use enclosed local variables?
  3640.         {
  3641.             if (super_type -> LocalClassProcessingCompleted())
  3642.             {
  3643.                 //
  3644.                 // TODO: Should we set the size for the super_call arguments here ???
  3645.                 //
  3646.                 for (int i = 1; i < super_type -> NumConstructorParameters(); i++)
  3647.                 {
  3648.                     VariableSymbol *local = super_type -> ConstructorParameter(i) -> accessed_local;
  3649.  
  3650.                     AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(super_call -> super_token);
  3651.  
  3652.                     anonymous_type -> FindOrInsertLocalShadow(local);
  3653.                     simple_name -> symbol = block_symbol -> FindVariableSymbol(local -> Identity());
  3654. assert(simple_name -> symbol);
  3655.                     super_call -> AddLocalArgument(simple_name);
  3656.                 }
  3657. assert(super_constructor -> LocalConstructor() && (! super_constructor -> IsGeneratedLocalConstructor()));
  3658.                 super_call -> symbol = super_constructor -> LocalConstructor();
  3659.             }
  3660.             else // are we currently within the body of the type in question ?
  3661.                 super_type -> AddLocalConstructorCallEnvironment(GetEnvironment(super_call));
  3662.         }
  3663.     }
  3664.     else if (super_call -> base_opt)
  3665.     {
  3666.         super_this0_variable = block_symbol -> InsertVariableSymbol(control.MakeParameter(0));
  3667.         super_this0_variable -> MarkSynthetic();
  3668.         super_this0_variable -> SetType(super_call -> base_opt -> Type());
  3669.         super_this0_variable -> SetOwner(constructor);
  3670.         super_this0_variable -> SetLocalVariableIndex(block_symbol -> max_variable_index++);
  3671.  
  3672.         constructor -> AddFormalParameter(super_this0_variable);
  3673.     }
  3674.  
  3675.     //
  3676.     // Complete the definition of the constructor and update the super call accordingly.
  3677.     //
  3678.     if (super_this0_variable)
  3679.     {
  3680.         class_creation -> AddArgument(super_call -> base_opt); // pass the original base expression as argument to anonymous class.
  3681.  
  3682.         AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(class_creation -> new_token);
  3683.         simple_name -> symbol = super_this0_variable;
  3684.         super_call -> base_opt = simple_name; // pass the base expression argument to the super class
  3685.     }
  3686.  
  3687.     constructor -> SetSignature(control, this0_variable); // we now have all the information to set the signature of the constructor.
  3688.  
  3689.     //
  3690.     // Are we guaranteed to have all the info available here? Yes,
  3691.     // because if the anonymous type is not local to a method, then its super
  3692.     // type cannot be local to a method. Therefore, no extra argument (other than
  3693.     // the proper this$0 specified in the base) is needed. If on the other hand the
  3694.     // anonymous type is local and its supertype is also local, it must have appeared
  3695.     // before the anonymous type and therefore its information has already been computed.
  3696.     //
  3697.     for (int k = 0; k < super_constructor -> NumFormalParameters(); k++)
  3698.     {
  3699.         VariableSymbol *param = super_constructor -> FormalParameter(k),
  3700.                        *symbol = block_symbol -> FindVariableSymbol(param -> Identity());
  3701. assert(symbol);
  3702.         AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(class_creation -> new_token);
  3703.         simple_name -> symbol = symbol;
  3704.         super_call -> AddArgument(simple_name);
  3705.     }
  3706.  
  3707.     class_creation -> class_type -> symbol = constructor;
  3708.  
  3709.     return;
  3710. }
  3711.  
  3712.  
  3713. TypeSymbol *Semantic::GetAnonymousType(AstClassInstanceCreationExpression *class_creation, TypeSymbol *super_type)
  3714. {
  3715.     TypeSymbol *this_type = ThisType();
  3716.  
  3717.     if (super_type -> ACC_FINAL())
  3718.     {
  3719.          ReportSemError(SemanticError::SUPER_IS_FINAL,
  3720.                         class_creation -> class_type -> LeftToken(),
  3721.                         class_creation -> class_type -> RightToken(),
  3722.                         super_type -> ContainingPackage() -> PackageName(),
  3723.                         super_type -> ExternalName());
  3724.     }
  3725.  
  3726.     AstClassBody *class_body = class_creation -> class_body_opt;
  3727.     TypeSymbol *outermost_type = this_type -> outermost_type;
  3728.  
  3729.     //
  3730.     // Make up a proper name for the anonymous type
  3731.     //
  3732.     int num = outermost_type -> num_anonymous_types() + 1;
  3733.     wchar_t str[11],
  3734.             *p = &str[10];
  3735.     *p = U_NULL;
  3736.     do
  3737.     {
  3738.         p--;
  3739.         *p = U_0 + (num % 10);
  3740.         num /= 10;
  3741.     } while (num > 0);
  3742.  
  3743.     int length = wcslen(p) + outermost_type -> NameLength() + 1; // +1 for $
  3744.     wchar_t *anonymous_name = new wchar_t[length + 1];
  3745.     wcscpy(anonymous_name, outermost_type -> Name());
  3746.     wcscat(anonymous_name, StringConstant::US__DS_);
  3747.     wcscat(anonymous_name, p);
  3748.  
  3749.     NameSymbol *name_symbol = control.FindOrInsertName(anonymous_name, length);
  3750.  
  3751. assert((! ThisMethod()) || LocalSymbolTable().Top());
  3752.     TypeSymbol *inner_type = (ThisMethod() ? LocalSymbolTable().Top() -> InsertAnonymousTypeSymbol(name_symbol)
  3753.                                            : this_type -> InsertAnonymousTypeSymbol(name_symbol));
  3754.     inner_type -> SetACC_PRIVATE();
  3755.     inner_type -> MarkAnonymous();
  3756.     inner_type -> outermost_type = outermost_type;
  3757.     inner_type -> supertypes_closure = new SymbolSet;
  3758.     inner_type -> subtypes_closure = new SymbolSet;
  3759.     inner_type -> semantic_environment = new SemanticEnvironment((Semantic *) this, inner_type, state_stack.Top());
  3760.     inner_type -> declaration = class_creation;
  3761.     inner_type -> file_symbol = source_file_symbol;
  3762.     inner_type -> SetOwner(ThisMethod() ? (Symbol *) ThisMethod() : (Symbol *) this_type);
  3763.     //
  3764.     // Add 3 extra elements for padding. May need a default constructor and other support elements.
  3765.     //
  3766.     inner_type -> SetSymbolTable(class_body -> NumClassBodyDeclarations() + 3);
  3767.     inner_type -> SetLocation();
  3768.     inner_type -> SetSignature(control);
  3769.  
  3770.     //
  3771.     // TODO: As an anonymous type cannot be a super class, it makes sense to mark
  3772.     // is final. This allows jikes to be consistent with javac in emitting an
  3773.     // error message when the anonymous class is checked in an instanceof
  3774.     // operation against an interface. However, this fact is not documented
  3775.     // in the 1.1 document. Furthermore, the class file that is emitted for an
  3776.     // anonymous flag (when processed by javac) does not have the FINAL flag turned on.
  3777.     // We also turn this flag off after processing the body of the anonymmous type.
  3778.     // See bolow...
  3779.     //
  3780.     inner_type -> SetACC_FINAL();
  3781.  
  3782.     if (StaticRegion())
  3783.          inner_type -> SetACC_STATIC();
  3784.     else inner_type -> InsertThis(0);
  3785.  
  3786.     if (super_type -> ACC_INTERFACE())
  3787.     {
  3788.          inner_type -> AddInterface(super_type);
  3789.          inner_type -> super = control.Object();
  3790.     }
  3791.     else inner_type -> super = super_type;
  3792.  
  3793.     outermost_type -> AddAnonymousType(inner_type);
  3794.     delete [] anonymous_name;
  3795.  
  3796.     //
  3797.     //
  3798.     //
  3799.     GetAnonymousConstructor(class_creation, inner_type);
  3800.  
  3801.     //
  3802.     // Now process the body of the anonymous class !!!
  3803.     //
  3804.     CheckClassMembers(inner_type, class_body);
  3805.     ProcessNestedTypeHeaders(inner_type, class_body);
  3806.     if (inner_type -> owner -> MethodCast())
  3807.          ProcessSuperTypesOfOuterType(inner_type);
  3808.     else ProcessNestedSuperTypes(inner_type);
  3809.  
  3810.     //
  3811.     // If the class body has not yet been parsed, do so now.
  3812.     //
  3813.     if (class_body -> UnparsedClassBodyCast())
  3814.     {
  3815.         if (! control.parser -> InitializerParse(lex_stream, class_body))
  3816.              compilation_unit -> kind = Ast::BAD_COMPILATION; // mark the fact that syntax errors were detected
  3817.         else
  3818.         {
  3819.             inner_type -> MarkHeaderProcessed();
  3820.             ProcessMembers(inner_type -> semantic_environment, class_body);
  3821.             CompleteSymbolTable(inner_type -> semantic_environment, class_body -> left_brace_token, class_body);
  3822.         }
  3823.  
  3824.         if (! control.parser -> BodyParse(lex_stream, class_body))
  3825.              compilation_unit -> kind = Ast::BAD_COMPILATION; // mark the fact that syntax errors were detected
  3826.         else ProcessExecutableBodies(inner_type -> semantic_environment, class_body);
  3827.     }
  3828.     else // The relevant bodies have already been parsed
  3829.     {
  3830.         inner_type -> MarkHeaderProcessed();
  3831.         ProcessMembers(inner_type -> semantic_environment, class_body);
  3832.         CompleteSymbolTable(inner_type -> semantic_environment, class_body -> left_brace_token, class_body);
  3833.         ProcessExecutableBodies(inner_type -> semantic_environment, class_body);
  3834.     }
  3835.  
  3836.     //
  3837.     // Add the default constructor to the body of the anonymous type.
  3838.     // If the symbol was resolve to "no_type" then constructor will be NULL
  3839.     //
  3840.     MethodSymbol *constructor = class_creation -> class_type -> symbol -> MethodCast();
  3841.     if (constructor)
  3842.     {
  3843.         class_body -> default_constructor = (AstConstructorDeclaration *) constructor -> method_or_constructor_declaration;
  3844.  
  3845.         if (inner_type -> IsLocal())
  3846.         {
  3847.             inner_type -> AddLocalConstructorCallEnvironment(GetEnvironment(class_creation));
  3848.             UpdateLocalConstructors(inner_type);
  3849.         }
  3850.     }
  3851.  
  3852.     //
  3853.     // TODO: See comment above regarding the setting of this flag.
  3854.     //
  3855.     inner_type -> ResetACC_FINAL();
  3856.  
  3857.     return inner_type;
  3858. }
  3859.  
  3860.  
  3861. void Semantic::ProcessClassInstanceCreationExpression(Ast *expr)
  3862. {
  3863.     AstClassInstanceCreationExpression *class_creation = (AstClassInstanceCreationExpression *) expr;
  3864.  
  3865.     if (class_creation -> base_opt || class_creation -> class_body_opt)
  3866.     {
  3867.         if (! control.option.one_one)
  3868.         {
  3869.             ReportSemError(SemanticError::ONE_ONE_FEATURE,
  3870.                            class_creation -> LeftToken(),
  3871.                            class_creation -> RightToken());
  3872.         }
  3873.     }
  3874.  
  3875.     //
  3876.     // This operation may throw OutOfMemoryError
  3877.     //
  3878.     SymbolSet *exception_set = TryExceptionTableStack().Top();
  3879.     if (exception_set)
  3880.     {
  3881.         exception_set -> AddElement(control.RuntimeException());
  3882.         exception_set -> AddElement(control.Error());
  3883.     }
  3884.  
  3885.     Ast *actual_type = class_creation -> class_type -> type;
  3886.     TypeSymbol *type;
  3887.     if (class_creation -> base_opt)
  3888.     {
  3889.         ProcessExpression(class_creation -> base_opt);
  3890.  
  3891.         TypeSymbol *enclosing_type = class_creation -> base_opt -> Type();
  3892.         if (enclosing_type == control.no_type)
  3893.         {
  3894.             class_creation -> symbol = control.no_type;
  3895.             return;
  3896.         }
  3897.         else if (enclosing_type == control.null_type || enclosing_type -> Primitive())
  3898.         {
  3899.             ReportSemError(SemanticError::TYPE_NOT_REFERENCE,
  3900.                            class_creation -> base_opt -> LeftToken(),
  3901.                            class_creation -> base_opt -> RightToken(),
  3902.                            enclosing_type -> ExternalName());
  3903.             class_creation -> symbol = control.no_type;
  3904.             return;
  3905.         }
  3906.  
  3907.         //
  3908.         // The grammar guarantees that the actual type is a simple name.
  3909.         //
  3910.         type = MustFindNestedType(enclosing_type, actual_type);
  3911.         if (type -> ACC_STATIC())
  3912.         {
  3913.             ReportSemError(SemanticError::STATIC_NOT_INNER_CLASS,
  3914.                            actual_type -> LeftToken(),
  3915.                            actual_type -> RightToken(),
  3916.                            type -> ContainingPackage() -> PackageName(),
  3917.                            type -> ExternalName());
  3918.         }
  3919.     }
  3920.     else
  3921.     {
  3922.         type = MustFindType(actual_type);
  3923.         if (type -> IsInner())
  3924.             class_creation -> base_opt = CreateAccessToType(class_creation, type -> ContainingType());
  3925.     }
  3926.  
  3927.  
  3928.     bool no_bad_argument = true;
  3929.     for (int i = 0; i < class_creation -> NumArguments(); i++)
  3930.     {
  3931.         AstExpression *expr = class_creation -> Argument(i);
  3932.         ProcessExpression(expr); // TODO: ProcessExpressionOrStringConstant(expr);
  3933.         no_bad_argument = no_bad_argument && (expr -> symbol != control.no_type);
  3934.     }
  3935.  
  3936.     TypeSymbol *anonymous_type = NULL;
  3937.  
  3938.     if (! no_bad_argument)
  3939.     {
  3940.         class_creation -> class_type -> symbol = control.no_type;
  3941.         class_creation -> symbol = type;
  3942.     }
  3943.     else
  3944.     {
  3945.         MethodSymbol *method = FindConstructor((type -> ACC_INTERFACE() ? control.Object() : type),
  3946.                                                 class_creation,
  3947.                                                 actual_type -> LeftToken(),
  3948.                                                 class_creation -> right_parenthesis_token);
  3949.  
  3950.         if (! method)
  3951.         {
  3952.             class_creation -> class_type -> symbol = control.no_type;
  3953.             class_creation -> symbol = type;
  3954.         }
  3955.         else
  3956.         {
  3957.             if (class_creation -> base_opt &&
  3958.                 (class_creation -> base_opt -> symbol != control.no_type) && 
  3959.                 (class_creation -> base_opt -> Type() != method -> containing_type -> ContainingType()))
  3960.             {
  3961. assert(method -> containing_type);
  3962. assert(method -> containing_type -> ContainingType());
  3963. assert(class_creation -> base_opt -> Type());
  3964. assert(CanMethodInvocationConvert(method -> containing_type -> ContainingType(), class_creation -> base_opt -> Type()));
  3965.                 class_creation -> base_opt = ConvertToType(class_creation -> base_opt, method -> containing_type -> ContainingType());
  3966.             }
  3967.  
  3968.             for (int i = 0; i < class_creation -> NumArguments(); i++)
  3969.             {
  3970.                 AstExpression *expr = class_creation -> Argument(i);
  3971.                 if (expr -> Type() != method -> FormalParameter(i) -> Type())
  3972.                     class_creation -> Argument(i) = ConvertToType(expr, method -> FormalParameter(i) -> Type());
  3973.             }        
  3974.  
  3975.             if (class_creation -> class_body_opt)
  3976.                 anonymous_type = GetAnonymousType(class_creation, type);
  3977.             else
  3978.             {
  3979.                 if (type -> ACC_INTERFACE())
  3980.                 {
  3981.                     ReportSemError(SemanticError::NOT_A_CLASS,
  3982.                                    actual_type -> LeftToken(),
  3983.                                    actual_type -> RightToken(),
  3984.                                    type -> ContainingPackage() -> PackageName(),
  3985.                                    type -> ExternalName());
  3986.                     class_creation -> symbol = control.no_type;
  3987.                     return;
  3988.                 }
  3989.                 else if (type -> ACC_ABSTRACT())
  3990.                 {
  3991.                     ReportSemError(SemanticError::ABSTRACT_TYPE_CREATION,
  3992.                                    actual_type -> LeftToken(),
  3993.                                    actual_type -> RightToken(),
  3994.                                    type -> ExternalName());
  3995.                 }
  3996.  
  3997.                 class_creation -> class_type -> symbol = method;
  3998.  
  3999.                 if (exception_set)
  4000.                 {
  4001.                     for (int i = method -> NumThrows((Semantic *) this, actual_type -> RightToken()) - 1; i >= 0; i--)
  4002.                         exception_set -> AddElement(method -> Throws(i));
  4003.                 }
  4004.  
  4005.                 if (! (ThisType() -> Anonymous() && ThisMethod() && ThisMethod() -> Identity() == control.block_init_name_symbol))
  4006.                 {
  4007.                     for (int k = method -> NumThrows((Semantic *) this, actual_type -> RightToken()) - 1; k >= 0; k--)
  4008.                     {
  4009.                         TypeSymbol *exception = method -> Throws(k);
  4010.                         if (! CatchableException(exception))
  4011.                         {
  4012.                             ReportSemError(SemanticError::UNCATCHABLE_CONSTRUCTOR_THROWN_CHECKED_EXCEPTION,
  4013.                                            actual_type -> LeftToken(),
  4014.                                            actual_type -> RightToken(),
  4015.                                            type -> ExternalName(),
  4016.                                            exception -> ContainingPackage() -> PackageName(),
  4017.                                            exception -> ExternalName());
  4018.                         }
  4019.                     }
  4020.                 }
  4021.             }
  4022.  
  4023.             class_creation -> symbol = (anonymous_type ? anonymous_type : type);
  4024.  
  4025.             if (method -> ACC_PRIVATE() && ThisType() != type && ThisType() -> outermost_type == type -> outermost_type)
  4026.             {
  4027.                 //
  4028.                 // TODO: Awaiting language clarification.
  4029.                 //
  4030.                 ReportSemError(SemanticError::PRIVATE_ENCLOSED_CONSTRUCTOR,
  4031.                                class_creation -> new_token,
  4032.                                class_creation -> right_parenthesis_token,
  4033.                                method -> Header());
  4034.  
  4035.                 method = TypeSymbol::GetReadAccessMethod(method);
  4036.                 class_creation -> class_type -> symbol = method;
  4037.             }
  4038.             else ConstructorAccessCheck(class_creation, method);
  4039.  
  4040.             //
  4041.             // A local type may use enclosed local variables. So, we at least allocate the 
  4042.             // space for adding these extra arguments. If the type being created has already been
  4043.             // fully processed, add the extra arguments here.
  4044.             //
  4045.             if ((! anonymous_type) && type -> IsLocal())
  4046.             {
  4047.                 if (type -> LocalClassProcessingCompleted() && method -> LocalConstructor())
  4048.                 {
  4049. assert(! method -> IsGeneratedLocalConstructor());
  4050.                     class_creation -> class_type -> symbol = method -> LocalConstructor();
  4051. assert(method -> LocalConstructor() -> signature);
  4052.  
  4053.                     //
  4054.                     // Are we currently within the body of the method that contains
  4055.                     // the local type in question?
  4056.                     //
  4057.                     if (type -> owner == ThisMethod())
  4058.                     {
  4059.                         for (int i = (type -> ACC_STATIC() ? 0 : 1); i < type -> NumConstructorParameters(); i++)
  4060.                         {
  4061.                             VariableSymbol *local = type -> ConstructorParameter(i) -> accessed_local;
  4062.  
  4063.                             AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(class_creation -> new_token);
  4064.                             simple_name -> symbol = local;
  4065.                             class_creation -> AddLocalArgument(simple_name);
  4066.                         }
  4067.                     }
  4068.                     else
  4069.                     {
  4070.                         for (int i = (type -> ACC_STATIC() ? 0 : 1); i < type -> NumConstructorParameters(); i++)
  4071.                         {
  4072.                             VariableSymbol *local = type -> ConstructorParameter(i) -> accessed_local;
  4073.  
  4074.                             AstSimpleName *simple_name = compilation_unit -> ast_pool -> GenSimpleName(class_creation -> new_token);
  4075.                             simple_name -> symbol = ThisType() -> FindOrInsertLocalShadow(local);
  4076.                             class_creation -> AddLocalArgument(simple_name);
  4077.                         }
  4078.                     }
  4079.                 }
  4080.                 else // are we within body of type in question? Save processing for later. See ProcessClassDeclaration in body.cpp
  4081.                     type -> AddLocalConstructorCallEnvironment(GetEnvironment(class_creation));
  4082.             }
  4083.         }
  4084.     }
  4085.  
  4086.     return;
  4087. }
  4088.  
  4089.  
  4090. void Semantic::ProcessArrayCreationExpression(Ast *expr)
  4091. {
  4092.     AstArrayCreationExpression *array_creation = (AstArrayCreationExpression *) expr;
  4093.  
  4094.     //
  4095.     // This operation may throw OutOfMemoryError or NegativeArraySizeException
  4096.     //
  4097.     SymbolSet *exception_set = TryExceptionTableStack().Top();
  4098.     if (exception_set)
  4099.     {
  4100.         exception_set -> AddElement(control.RuntimeException());
  4101.         exception_set -> AddElement(control.Error());
  4102.     }
  4103.  
  4104.     AstArrayType *array_type;
  4105.  
  4106.     TypeSymbol *type;
  4107.  
  4108.     if (array_type = array_creation -> array_type -> ArrayTypeCast())
  4109.     {
  4110.         if (! control.option.one_one)
  4111.         {
  4112.             ReportSemError(SemanticError::ONE_ONE_FEATURE,
  4113.                            array_creation -> LeftToken(),
  4114.                            array_creation -> RightToken());
  4115.         }
  4116.  
  4117.         AstPrimitiveType *primitive_type = array_type -> type -> PrimitiveTypeCast();
  4118.         type = (primitive_type ? FindPrimitiveType(primitive_type) : MustFindType(array_type -> type));
  4119.     }
  4120.     else
  4121.     {
  4122.         AstPrimitiveType *primitive_type = array_creation -> array_type -> PrimitiveTypeCast();
  4123.         type = (primitive_type ? FindPrimitiveType(primitive_type) : MustFindType(array_creation -> array_type));
  4124.     }
  4125.  
  4126.     int num_dimensions = (array_type ? array_type -> NumBrackets()
  4127.                                      : array_creation -> NumDimExprs() + array_creation -> NumBrackets());
  4128.  
  4129.     if (num_dimensions > 0)
  4130.         type = type -> GetArrayType((Semantic *) this, num_dimensions);
  4131.     array_creation -> symbol = type;
  4132.  
  4133.     for (int i = 0; i < array_creation -> NumDimExprs(); i++)
  4134.     {
  4135.         AstDimExpr *dim_expr = array_creation -> DimExpr(i);
  4136.         ProcessExpression(dim_expr -> expression);
  4137.         AstExpression *expr = PromoteUnaryNumericExpression(dim_expr -> expression);
  4138.         if (expr -> Type() != control.int_type && expr -> symbol != control.no_type)
  4139.         {
  4140.             ReportSemError(SemanticError::TYPE_NOT_INTEGER,
  4141.                            dim_expr -> expression -> LeftToken(),
  4142.                            dim_expr -> expression -> RightToken(),
  4143.                            dim_expr -> expression -> Type() -> Name());
  4144.         }
  4145.         dim_expr -> expression = expr;
  4146.     }
  4147.  
  4148.     if (array_creation -> array_initializer_opt)
  4149.         ProcessArrayInitializer((AstArrayInitializer *) array_creation -> array_initializer_opt, type);
  4150.  
  4151.     return;
  4152. }
  4153.  
  4154.  
  4155. void Semantic::ProcessPostUnaryExpression(Ast *expr)
  4156. {
  4157.     AstPostUnaryExpression *postfix_expression = (AstPostUnaryExpression *) expr;
  4158.  
  4159.     ProcessExpression(postfix_expression -> expression);
  4160.     postfix_expression -> symbol = postfix_expression -> expression -> symbol;
  4161.  
  4162.     if (postfix_expression -> symbol != control.no_type)
  4163.     {
  4164.         if (! postfix_expression -> expression -> IsLeftHandSide())
  4165.         {
  4166.             ReportSemError(SemanticError::NOT_A_NUMERIC_VARIABLE,
  4167.                            postfix_expression -> expression -> LeftToken(),
  4168.                            postfix_expression -> expression -> RightToken(),
  4169.                            postfix_expression -> expression -> Type() -> Name());
  4170.             postfix_expression -> symbol = control.no_type;
  4171.         }
  4172.         else if (! control.IsNumeric(postfix_expression -> Type()))
  4173.         {
  4174.             ReportSemError(SemanticError::TYPE_NOT_NUMERIC,
  4175.                            postfix_expression -> expression -> LeftToken(),
  4176.                            postfix_expression -> expression -> RightToken(),
  4177.                            postfix_expression -> Type() -> Name());
  4178.             postfix_expression -> symbol = control.no_type;
  4179.         }
  4180.         else if (! postfix_expression -> expression -> ArrayAccessCast()) // some kind of name
  4181.         {
  4182.             MethodSymbol *read_method = NULL;
  4183.             AstSimpleName *simple_name = postfix_expression -> expression -> SimpleNameCast();
  4184.             if (simple_name)
  4185.             {
  4186.                 if (simple_name -> resolution_opt)
  4187.                    read_method = simple_name -> resolution_opt -> symbol -> MethodCast();
  4188.             }
  4189.             else
  4190.             {
  4191.                 AstFieldAccess *field_access = (AstFieldAccess *) postfix_expression -> expression;
  4192.                 if (field_access -> resolution_opt)
  4193.                     read_method = field_access -> resolution_opt -> symbol -> MethodCast();
  4194.             }
  4195.  
  4196.             VariableSymbol *variable_symbol;
  4197.             if (read_method)
  4198.             {
  4199.                 variable_symbol = (VariableSymbol *) read_method -> accessed_member;
  4200.                 postfix_expression -> write_method = TypeSymbol::GetWriteAccessMethod(variable_symbol);
  4201.             }
  4202.             else variable_symbol = postfix_expression -> expression -> symbol -> VariableCast();
  4203.         }
  4204.     }
  4205.  
  4206.     return;
  4207. }
  4208.  
  4209.  
  4210. void Semantic::ProcessPLUS(AstPreUnaryExpression *expr)
  4211. {
  4212.     ProcessExpression(expr -> expression);
  4213.     expr -> expression = PromoteUnaryNumericExpression(expr -> expression);
  4214.     expr -> value = expr -> expression -> value;
  4215.     expr -> symbol = expr -> expression -> symbol;
  4216. }
  4217.  
  4218.  
  4219. void Semantic::ProcessMINUS(AstPreUnaryExpression *expr)
  4220. {
  4221.     AstIntegerLiteral *int_literal;
  4222.     AstLongLiteral *long_literal;
  4223.  
  4224.     if (int_literal = expr -> expression -> IntegerLiteralCast())
  4225.     {
  4226.         LiteralSymbol *literal = (LiteralSymbol *) lex_stream -> NameSymbol(int_literal -> integer_literal_token);
  4227.  
  4228.         expr -> value = control.int_pool.FindOrInsertNegativeInt(literal);
  4229.         if (expr -> value == &control.bad_value)
  4230.         {
  4231.             ReportSemError(SemanticError::INVALID_INT_VALUE,
  4232.                            expr -> LeftToken(),
  4233.                            expr -> RightToken());
  4234.             expr -> symbol = control.no_type;
  4235.         }
  4236.         else expr -> symbol = control.int_type;
  4237.     }
  4238.     else if (long_literal = expr -> expression -> LongLiteralCast())
  4239.     {
  4240.         LiteralSymbol *literal = (LiteralSymbol *) lex_stream -> NameSymbol(long_literal -> long_literal_token);
  4241.  
  4242.         expr -> value = control.long_pool.FindOrInsertNegativeLong(literal);
  4243.         if (expr -> value == &control.bad_value)
  4244.         {
  4245.             ReportSemError(SemanticError::INVALID_LONG_VALUE,
  4246.                            expr -> LeftToken(),
  4247.                            expr -> RightToken());
  4248.             expr -> symbol = control.no_type;
  4249.         }
  4250.         else expr -> symbol = control.long_type;
  4251.     }
  4252.     else
  4253.     {
  4254.         ProcessExpression(expr -> expression);
  4255.  
  4256.         expr -> expression = PromoteUnaryNumericExpression(expr -> expression);
  4257.         expr -> symbol = expr -> expression -> symbol;
  4258.         if (expr -> expression -> IsConstant())
  4259.         {
  4260.             TypeSymbol *type = expr -> Type();
  4261.  
  4262.             if (type == control.double_type)
  4263.             {
  4264.                 DoubleLiteralValue *literal = (DoubleLiteralValue *) expr -> expression -> value;
  4265.                 expr -> value = control.double_pool.FindOrInsert(-literal -> value);
  4266.             }
  4267.             else if (type == control.float_type)
  4268.             {
  4269.                 FloatLiteralValue *literal = (FloatLiteralValue *) expr -> expression -> value;
  4270.                 expr -> value = control.float_pool.FindOrInsert(-literal -> value);
  4271.             }
  4272.             else if (type == control.long_type)
  4273.             {
  4274.                 LongLiteralValue *literal = (LongLiteralValue *) expr -> expression -> value;
  4275.                 expr -> value = control.long_pool.FindOrInsert(-literal -> value);
  4276.             }
  4277.             else
  4278.             {
  4279.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> expression -> value;
  4280.                 expr -> value = control.int_pool.FindOrInsert(-literal -> value);
  4281.             }
  4282.         }
  4283.     }
  4284.  
  4285.     return;
  4286. }
  4287.  
  4288.  
  4289. void Semantic::ProcessTWIDDLE(AstPreUnaryExpression *expr)
  4290. {
  4291.     ProcessExpression(expr -> expression);
  4292.  
  4293.     if (expr -> expression -> symbol != control.no_type && (! control.IsIntegral(expr -> expression -> Type())))
  4294.     {
  4295.         ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  4296.                        expr -> expression -> LeftToken(),
  4297.                        expr -> expression -> RightToken(),
  4298.                        expr -> expression -> Type() -> Name());
  4299.         expr -> symbol = control.no_type;
  4300.     }
  4301.     else
  4302.     {
  4303.         expr -> expression = PromoteUnaryNumericExpression(expr -> expression);
  4304.  
  4305.         if (expr -> expression -> IsConstant())
  4306.         {
  4307.             if (expr -> expression -> Type() == control.long_type)
  4308.             {
  4309.                 LongLiteralValue *literal = (LongLiteralValue *) expr -> expression -> value;
  4310.                 expr -> value = control.long_pool.FindOrInsert(~literal -> value);
  4311.             }
  4312.             else // assert(expr -> expression -> Type() == control.int_type)
  4313.             {
  4314.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> expression -> value;
  4315.                 expr -> value = control.int_pool.FindOrInsert(~literal -> value);
  4316.             }
  4317.         }
  4318.         expr -> symbol = expr -> expression -> symbol;
  4319.     }
  4320.  
  4321.     return;
  4322. }
  4323.  
  4324.  
  4325. void Semantic::ProcessNOT(AstPreUnaryExpression *expr)
  4326. {
  4327.     ProcessExpression(expr -> expression);
  4328.  
  4329.     if (expr -> expression -> symbol != control.no_type && expr -> expression -> Type() != control.boolean_type)
  4330.     {
  4331.         ReportSemError(SemanticError::TYPE_NOT_BOOLEAN,
  4332.                        expr -> expression -> LeftToken(),
  4333.                        expr -> expression -> RightToken(),
  4334.                        expr -> expression -> Type() -> Name());
  4335.         expr -> symbol = control.no_type;
  4336.     }
  4337.     else
  4338.     {
  4339.         if (expr -> expression -> IsConstant())
  4340.         {
  4341.             IntLiteralValue *literal = (IntLiteralValue *) expr -> expression -> value;
  4342.             expr -> value = control.int_pool.FindOrInsert(literal -> value ? 0 : 1);
  4343.         }
  4344.         expr -> symbol = control.boolean_type;
  4345.     }
  4346.  
  4347.     return;
  4348. }
  4349.  
  4350.  
  4351. void Semantic::ProcessPLUSPLUSOrMINUSMINUS(AstPreUnaryExpression *expr)
  4352. {
  4353.     ProcessExpression(expr -> expression);
  4354.  
  4355.     if (expr -> expression -> symbol != control.no_type)
  4356.     {
  4357.         if (! expr -> expression -> IsLeftHandSide())
  4358.         {
  4359.             ReportSemError(SemanticError::NOT_A_NUMERIC_VARIABLE,
  4360.                            expr -> expression -> LeftToken(),
  4361.                            expr -> expression -> RightToken(),
  4362.                            expr -> expression -> Type() -> Name());
  4363.             expr -> symbol = control.no_type;
  4364.         }
  4365.         else if (! control.IsNumeric(expr -> expression -> Type()))
  4366.         {
  4367.             ReportSemError(SemanticError::TYPE_NOT_NUMERIC,
  4368.                            expr -> expression -> LeftToken(),
  4369.                            expr -> expression -> RightToken(),
  4370.                            expr -> expression -> Type() -> Name());
  4371.             expr -> symbol = control.no_type;
  4372.         }
  4373.         else if (! expr -> expression -> ArrayAccessCast()) // some kind of name
  4374.         {
  4375.             MethodSymbol *read_method = NULL;
  4376.             AstSimpleName *simple_name = expr -> expression -> SimpleNameCast();
  4377.             if (simple_name)
  4378.             {
  4379.                 if (simple_name -> resolution_opt)
  4380.                    read_method = simple_name -> resolution_opt -> symbol -> MethodCast();
  4381.             }
  4382.             else
  4383.             {
  4384.                 AstFieldAccess *field_access = (AstFieldAccess *) expr -> expression;
  4385.                 if (field_access -> resolution_opt)
  4386.                     read_method = field_access -> resolution_opt -> symbol -> MethodCast();
  4387.             }
  4388.  
  4389.             VariableSymbol *variable_symbol;
  4390.             if (read_method)
  4391.             {
  4392.                 variable_symbol = (VariableSymbol *) read_method -> accessed_member;
  4393.                 expr -> write_method = TypeSymbol::GetWriteAccessMethod(variable_symbol);
  4394.             }
  4395.             else variable_symbol = expr -> expression -> symbol -> VariableCast();
  4396.         }
  4397.     }
  4398.     expr -> symbol = expr -> expression -> symbol;
  4399.  
  4400.     return;
  4401. }
  4402.  
  4403.  
  4404. void Semantic::ProcessPreUnaryExpression(Ast *expr)
  4405. {
  4406.     AstPreUnaryExpression *prefix_expression = (AstPreUnaryExpression *) expr;
  4407.     (this ->* ProcessPreUnaryExpr[prefix_expression -> pre_unary_tag])(prefix_expression);
  4408.  
  4409.     return;
  4410. }
  4411.  
  4412.  
  4413. inline bool Semantic::CanWideningPrimitiveConvert(TypeSymbol *target_type, TypeSymbol *source_type)
  4414. {
  4415.     if (target_type == control.double_type)
  4416.          return (source_type == control.float_type || source_type == control.long_type  || source_type == control.int_type ||
  4417.                  source_type == control.char_type  || source_type == control.short_type || source_type == control.byte_type);
  4418.     else if (target_type == control.float_type)
  4419.          return (source_type == control.long_type  || source_type == control.int_type   ||
  4420.                  source_type == control.char_type  || source_type == control.short_type || source_type == control.byte_type);
  4421.     else if (target_type == control.long_type)
  4422.          return (source_type == control.int_type   || source_type == control.char_type  ||
  4423.                  source_type == control.short_type || source_type == control.byte_type);
  4424.     else if (target_type == control.int_type)
  4425.          return (source_type == control.char_type  || source_type == control.short_type || source_type == control.byte_type);
  4426.     else if (target_type == control.short_type)
  4427.          return source_type == control.byte_type;
  4428.  
  4429.     return false;
  4430. }
  4431.  
  4432.  
  4433. inline bool Semantic::CanNarrowingPrimitiveConvert(TypeSymbol *target_type, TypeSymbol *source_type)
  4434. {
  4435.     if (target_type == control.byte_type)
  4436.          return (source_type == control.double_type || source_type == control.float_type || source_type == control.long_type ||
  4437.                  source_type == control.int_type    || source_type == control.char_type  || source_type == control.short_type);
  4438.     else if (target_type == control.char_type)
  4439.          return (source_type == control.double_type || source_type == control.float_type || source_type == control.long_type ||
  4440.                  source_type == control.int_type    || source_type == control.short_type || source_type == control.byte_type);
  4441.     else if (target_type == control.short_type)
  4442.          return (source_type == control.double_type || source_type == control.float_type ||
  4443.                  source_type == control.long_type   || source_type == control.int_type   || source_type == control.char_type);
  4444.     else if (target_type == control.int_type)
  4445.          return (source_type == control.double_type || source_type == control.float_type || source_type == control.long_type);
  4446.     else if (target_type == control.long_type)
  4447.          return (source_type == control.double_type || source_type == control.float_type);
  4448.     else if (target_type == control.float_type)
  4449.          return source_type == control.double_type;
  4450.  
  4451.     return false;
  4452. }
  4453.  
  4454.  
  4455. bool Semantic::CanMethodInvocationConvert(TypeSymbol *target_type, TypeSymbol *source_type)
  4456. {
  4457.     if (target_type == control.no_type || source_type == control.no_type)
  4458.         return false;
  4459.  
  4460.     if (source_type -> Primitive())
  4461.     {
  4462.         if (! target_type -> Primitive())
  4463.             return false;
  4464.  
  4465.         return (target_type == source_type || CanWideningPrimitiveConvert(target_type, source_type));
  4466.     }
  4467.     else
  4468.     {
  4469.         if (target_type -> Primitive())
  4470.             return false;
  4471.  
  4472.         if (source_type -> IsArray())
  4473.         {
  4474.             if (target_type -> IsArray())
  4475.             {
  4476.                 TypeSymbol *source_subtype = source_type -> ArraySubtype();
  4477.                 TypeSymbol *target_subtype = target_type -> ArraySubtype();
  4478.                 return (source_subtype -> Primitive() && target_subtype -> Primitive()
  4479.                                                        ? (source_subtype == target_subtype)
  4480.                                                        : CanMethodInvocationConvert(target_subtype, source_subtype));
  4481.             }
  4482.             return (target_type == control.Object() ||
  4483.                     target_type == control.Cloneable() ||
  4484.                     //
  4485.                     // TODO: This is an undocumented feature, but this fix appears to make sense. 
  4486.                     //
  4487.                     (control.option.one_one && target_type == control.Serializable() && source_type -> Implements(target_type)));
  4488.         }
  4489.         else if (source_type -> ACC_INTERFACE())
  4490.         {
  4491.             if (target_type -> ACC_INTERFACE())
  4492.                  return source_type -> IsSubinterface(target_type);
  4493.             else if (target_type != control.Object()) // target is a class type
  4494.                  return false;
  4495.         }
  4496.         else if (source_type != control.null_type) // source_type is a class
  4497.         {
  4498.             if (target_type -> IsArray())
  4499.                  return false;
  4500.             else if (target_type -> ACC_INTERFACE())
  4501.                  return source_type -> Implements(target_type);
  4502.             else if (! source_type -> IsSubclass(target_type))
  4503.                  return false;
  4504.         }
  4505.     }
  4506.  
  4507.     return true;
  4508. }
  4509.  
  4510.  
  4511. bool Semantic::CanAssignmentConvertReference(TypeSymbol *target_type, TypeSymbol *source_type)
  4512. {
  4513.     return (target_type == control.no_type || 
  4514.             source_type == control.no_type ||
  4515.             CanMethodInvocationConvert(target_type, source_type)
  4516.            );
  4517. }
  4518.  
  4519.  
  4520. bool Semantic::CanAssignmentConvert(TypeSymbol *target_type, AstExpression *expr)
  4521. {
  4522.     return (target_type == control.no_type || 
  4523.             expr -> symbol == control.no_type ||
  4524.             CanMethodInvocationConvert(target_type, expr -> Type()) ||
  4525.             IsIntValueRepresentableInType(expr, target_type)
  4526.            );
  4527. }
  4528.  
  4529.  
  4530. bool Semantic::CanCastConvert(TypeSymbol *target_type, TypeSymbol *source_type, LexStream::TokenIndex tok)
  4531. {
  4532.     if (source_type == target_type || source_type == control.no_type || target_type == control.no_type)
  4533.         return true;
  4534.  
  4535.     if (source_type -> Primitive())
  4536.     {
  4537.         if (! target_type -> Primitive())
  4538.             return false;
  4539.  
  4540.         return (CanWideningPrimitiveConvert(target_type, source_type) || CanNarrowingPrimitiveConvert(target_type, source_type));
  4541.     }
  4542.     else
  4543.     {
  4544.         if (target_type -> Primitive())
  4545.             return false;
  4546.  
  4547.         if (source_type -> IsArray())
  4548.         {
  4549.             if (target_type -> IsArray())
  4550.             {
  4551.                 TypeSymbol *source_subtype = source_type -> ArraySubtype();
  4552.                 TypeSymbol *target_subtype = target_type -> ArraySubtype();
  4553.                 return (source_subtype -> Primitive() && target_subtype -> Primitive()
  4554.                                                        ? (source_subtype == target_subtype)
  4555.                                                        : CanCastConvert(target_subtype, source_subtype, tok));
  4556.             }
  4557.             return (target_type == control.Object() ||
  4558.                     target_type == control.Cloneable() ||
  4559.                     //
  4560.                     // TODO: This is an undocumented feature, but this fix appears to make sense. 
  4561.                     //
  4562.                     (control.option.one_one && target_type == control.Serializable() && source_type -> Implements(target_type)));
  4563.         }
  4564.         else if (source_type -> ACC_INTERFACE())
  4565.         {
  4566.             if (target_type -> ACC_INTERFACE())
  4567.             {
  4568.                 if (! source_type -> expanded_method_table)
  4569.                     ComputeMethodsClosure(source_type, tok);
  4570.                 if (! target_type -> expanded_method_table)
  4571.                     ComputeMethodsClosure(target_type, tok);
  4572.  
  4573.                 //
  4574.                 // Iterate over all methods in the source symbol table of the source_type interface;
  4575.                 // For each such method, if the target_type contains a method with the same signature,
  4576.                 // then make sure that the two methods have the same return type.
  4577.                 //
  4578.                 ExpandedMethodTable *source_method_table = source_type -> expanded_method_table;
  4579.                 int i;
  4580.                 for (i = 0; i < source_method_table -> symbol_pool.Length(); i++)
  4581.                 {
  4582.                     MethodSymbol *method1 = source_method_table -> symbol_pool[i] -> method_symbol;
  4583.                     MethodShadowSymbol *method_shadow2 = target_type -> expanded_method_table
  4584.                                                                      -> FindOverloadMethodShadow(method1, (Semantic *) this, tok);
  4585.                     if (method_shadow2)
  4586.                     {
  4587.                         if (! method1 -> IsTyped())
  4588.                             method1 -> ProcessMethodSignature((Semantic *) this, tok);
  4589.  
  4590.                         MethodSymbol *method2 = method_shadow2 -> method_symbol;
  4591.                         if (! method2 -> IsTyped())
  4592.                             method2 -> ProcessMethodSignature((Semantic *) this, tok);
  4593.                         if (method1 -> Type() != method2 -> Type())
  4594.                             break;
  4595.                     }
  4596.                 }
  4597.  
  4598.                 return (i == source_method_table -> symbol_pool.Length()); // all the methods passed the test
  4599.             }
  4600.             else if (target_type -> ACC_FINAL() && (! target_type -> Implements(source_type)))
  4601.                  return false;
  4602.         }
  4603.         else if (source_type != control.null_type) // source_type is a class
  4604.         {
  4605.             if (target_type -> IsArray())
  4606.             {
  4607.                 if (source_type != control.Object())
  4608.                     return false;
  4609.             }
  4610.             else if (target_type -> ACC_INTERFACE())
  4611.             {
  4612.                 if (source_type -> ACC_FINAL() && (! source_type -> Implements(target_type)))
  4613.                     return false;
  4614.             }
  4615.             else if ((! source_type -> IsSubclass(target_type)) && (! target_type -> IsSubclass(source_type)))
  4616.                  return false;
  4617.         }
  4618.     }
  4619.  
  4620.     return true;
  4621. }
  4622.  
  4623.  
  4624. LiteralValue *Semantic::CastPrimitiveValue(TypeSymbol *target_type, AstExpression *expr)
  4625. {
  4626.     LiteralValue *literal_value = NULL;
  4627.     TypeSymbol *source_type = expr -> Type();
  4628.  
  4629.     if (target_type == source_type)
  4630.         literal_value = expr -> value;
  4631.     else if (source_type != control.no_type)
  4632.     {
  4633.         char output_string[25];
  4634.         int len;
  4635.  
  4636.         if (target_type == control.String())
  4637.         {
  4638.             if (source_type == control.double_type)
  4639.             {
  4640.                 //
  4641.                 // TODO: Check correctness !!!
  4642.                 //
  4643.                 DoubleLiteralValue *literal = (DoubleLiteralValue *) expr -> value;
  4644.                 // sprintf(output_string, "%E", literal -> value);
  4645.                 literal -> value.String(output_string);
  4646.                 len = strlen(output_string);
  4647.                 literal_value = control.Utf8_pool.FindOrInsert(output_string, len);
  4648.             }
  4649.             else if (source_type == control.float_type)
  4650.             {
  4651.                 //
  4652.                 // TODO: Check correctness !!!
  4653.                 //
  4654.                 FloatLiteralValue *literal = (FloatLiteralValue *) expr -> value;
  4655.                 // sprintf(output_string, "%E", literal -> value);
  4656.                 literal -> value.String(output_string);
  4657.                 len = strlen(output_string);
  4658.                 //
  4659.                 // javac does not add the L suffix
  4660.                 //
  4661.                 // output_string[len++] = U_F;
  4662.                 //
  4663.                 output_string[len] = U_NULL;
  4664.                 literal_value = control.Utf8_pool.FindOrInsert(output_string, len);
  4665.             }
  4666.             else if (source_type == control.long_type)
  4667.             {
  4668.                 LongLiteralValue *literal = (LongLiteralValue *) expr -> value;
  4669.                 literal -> value.String(output_string);
  4670.                 len = strlen(output_string);
  4671.                 //
  4672.                 // javac does not add the L suffix
  4673.                 //
  4674.                 // output_string[len++] = U_L;
  4675.                 //
  4676.                 output_string[len] = U_NULL;
  4677.                 literal_value = control.Utf8_pool.FindOrInsert(output_string, len);
  4678.             }
  4679.             else if (source_type == control.char_type)
  4680.             {
  4681.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> value;
  4682.                 literal_value = control.Utf8_pool.FindOrInsert(literal -> value);
  4683.             }
  4684.             else if (control.IsSimpleIntegerValueType(source_type))
  4685.             {
  4686.                 //
  4687.                 // TODO: Check correctness !!!
  4688.                 //
  4689.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> value;
  4690.                 sprintf(output_string, "%i", literal -> value);
  4691.                 len = strlen(output_string);
  4692.                 literal_value = control.Utf8_pool.FindOrInsert(output_string, len);
  4693.             }
  4694.         }
  4695.         else if (target_type == control.double_type)
  4696.         {
  4697.             if (source_type == control.float_type)
  4698.             {
  4699.                 FloatLiteralValue *literal = (FloatLiteralValue *) expr -> value;
  4700.                 IEEEdouble value(literal -> value);
  4701.                 literal_value = control.double_pool.FindOrInsert(value);
  4702.             }
  4703.             else if (source_type == control.long_type)
  4704.             {
  4705.                 LongLiteralValue *literal = (LongLiteralValue *) expr -> value;
  4706.                 IEEEdouble value(literal -> value);
  4707.                 literal_value = control.double_pool.FindOrInsert(value);
  4708.             }
  4709.             else
  4710.             {
  4711.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> value;
  4712.                 IEEEdouble value(literal -> value);
  4713.                 literal_value = control.double_pool.FindOrInsert(value);
  4714.             }
  4715.         }
  4716.         else if (target_type == control.float_type)
  4717.         {
  4718.             if (source_type == control.double_type)
  4719.             {
  4720.                 DoubleLiteralValue *literal = (DoubleLiteralValue *) expr -> value;
  4721.                 IEEEfloat value(literal -> value);
  4722.                 literal_value = control.float_pool.FindOrInsert(value);
  4723.             }
  4724.             else if (source_type == control.long_type)
  4725.             {
  4726.                 LongLiteralValue *literal = (LongLiteralValue *) expr -> value;
  4727.                 IEEEfloat value(literal -> value);
  4728.                 literal_value = control.float_pool.FindOrInsert(value);
  4729.             }
  4730.             else
  4731.             {
  4732.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> value;
  4733.                 IEEEfloat value(literal -> value);
  4734.                 literal_value = control.float_pool.FindOrInsert(value);
  4735.             }
  4736.         }
  4737.         else if (target_type == control.long_type)
  4738.         {
  4739.             if (source_type == control.double_type)
  4740.             {
  4741.                 DoubleLiteralValue *literal = (DoubleLiteralValue *) expr -> value;
  4742.                 LongInt value(literal -> value);
  4743.                 literal_value = control.long_pool.FindOrInsert(value);
  4744.             }
  4745.             else if (source_type == control.float_type)
  4746.             {
  4747.                 FloatLiteralValue *literal = (FloatLiteralValue *) expr -> value;
  4748.                 LongInt value(literal -> value);
  4749.                 literal_value = control.long_pool.FindOrInsert(value);
  4750.             }
  4751.             else
  4752.             {
  4753.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> value;
  4754.                 literal_value = control.long_pool.FindOrInsert((LongInt) literal -> value);
  4755.             }
  4756.         }
  4757.         else if (target_type == control.int_type)
  4758.         {
  4759.             if (source_type == control.double_type)
  4760.             {
  4761.                 DoubleLiteralValue *literal = (DoubleLiteralValue *) expr -> value;
  4762.                 literal_value = control.int_pool.FindOrInsert((literal -> value).IntValue());
  4763.             }
  4764.             else if (source_type == control.float_type)
  4765.             {
  4766.                 FloatLiteralValue *literal = (FloatLiteralValue *) expr -> value;
  4767.                 literal_value = control.int_pool.FindOrInsert(literal -> value.IntValue());
  4768.             }
  4769.             else if (source_type == control.long_type)
  4770.             {
  4771.                 LongLiteralValue *literal = (LongLiteralValue *) expr -> value;
  4772.                 literal_value = control.int_pool.FindOrInsert((int) (literal -> value).LowWord());
  4773.             }
  4774.             else literal_value = expr -> value;
  4775.         }
  4776.         else if (target_type == control.char_type)
  4777.         {
  4778.             if (source_type == control.double_type)
  4779.             {
  4780.                 DoubleLiteralValue *literal = (DoubleLiteralValue *) expr -> value;
  4781.                 literal_value = control.int_pool.FindOrInsert((int) (u2) (literal -> value.IntValue()));
  4782.             }
  4783.             else if (source_type == control.float_type)
  4784.             {
  4785.                 FloatLiteralValue *literal = (FloatLiteralValue *) expr -> value;
  4786.                 literal_value = control.int_pool.FindOrInsert((int) (u2) (literal -> value.IntValue()));
  4787.             }
  4788.             else if (source_type == control.long_type)
  4789.             {
  4790.                 LongLiteralValue *literal = (LongLiteralValue *) expr -> value;
  4791.                 literal_value = control.int_pool.FindOrInsert((int) (u2) (literal -> value).LowWord());
  4792.             }
  4793.             else
  4794.             {
  4795.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> value;
  4796.                 literal_value = control.int_pool.FindOrInsert((int) (u2) literal -> value);
  4797.             }
  4798.         }
  4799.         else if (target_type == control.short_type)
  4800.         {
  4801.             if (source_type == control.double_type)
  4802.             {
  4803.                 DoubleLiteralValue *literal = (DoubleLiteralValue *) expr -> value;
  4804.                 literal_value = control.int_pool.FindOrInsert((int) (i2) (literal -> value.IntValue()));
  4805.             }
  4806.             else if (source_type == control.float_type)
  4807.             {
  4808.                 FloatLiteralValue *literal = (FloatLiteralValue *) expr -> value;
  4809.                 literal_value = control.int_pool.FindOrInsert((int) (i2) (literal -> value.IntValue()));
  4810.             }
  4811.             else if (source_type == control.long_type)
  4812.             {
  4813.                 LongLiteralValue *literal = (LongLiteralValue *) expr -> value;
  4814.                 literal_value = control.int_pool.FindOrInsert((int) (i2) (literal -> value).LowWord());
  4815.             }
  4816.             else
  4817.             {
  4818.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> value;
  4819.                 literal_value = control.int_pool.FindOrInsert((int) (i2) literal -> value);
  4820.             }
  4821.         }
  4822.         else if (target_type == control.byte_type)
  4823.         {
  4824.             if (source_type == control.double_type)
  4825.             {
  4826.                 DoubleLiteralValue *literal = (DoubleLiteralValue *) expr -> value;
  4827.                 literal_value = control.int_pool.FindOrInsert((int) (i1) (literal -> value.IntValue()));
  4828.             }
  4829.             else if (source_type == control.float_type)
  4830.             {
  4831.                 FloatLiteralValue *literal = (FloatLiteralValue *) expr -> value;
  4832.                 literal_value = control.int_pool.FindOrInsert((int) (i1) (literal -> value.IntValue()));
  4833.             }
  4834.             else if (source_type == control.long_type)
  4835.             {
  4836.                 LongLiteralValue *literal = (LongLiteralValue *) expr -> value;
  4837.                 literal_value = control.int_pool.FindOrInsert((int) (i1) (literal -> value).LowWord());
  4838.             }
  4839.             else
  4840.             {
  4841.                 IntLiteralValue *literal = (IntLiteralValue *) expr -> value;
  4842.                 literal_value = control.int_pool.FindOrInsert((int) (i1) literal -> value);
  4843.             }
  4844.         }
  4845.     }
  4846.  
  4847.     return literal_value;
  4848. }
  4849.  
  4850.  
  4851. //
  4852. // We only need to cast the value of constant primitive expressions.
  4853. //
  4854. inline LiteralValue *Semantic::CastValue(TypeSymbol *target_type, AstExpression *expr)
  4855. {
  4856.     return (LiteralValue *) (expr -> IsConstant() && target_type -> Primitive()
  4857.                                                    ? CastPrimitiveValue(target_type, expr)
  4858.                                                    : (expr -> value == control.NullValue() ? expr -> value : NULL));
  4859. }
  4860.  
  4861.  
  4862. void Semantic::ProcessCastExpression(Ast *expr)
  4863. {
  4864.     AstCastExpression *cast_expression = (AstCastExpression *) expr;
  4865.  
  4866.     //
  4867.     // This operation may throw ClassCastException
  4868.     //
  4869.     SymbolSet *exception_set = TryExceptionTableStack().Top();
  4870.     if (exception_set)
  4871.     {
  4872.         exception_set -> AddElement(control.RuntimeException());
  4873.         exception_set -> AddElement(control.Error());
  4874.     }
  4875.  
  4876.     ProcessExpression(cast_expression -> expression);
  4877.  
  4878.     TypeSymbol *source_type = cast_expression -> expression -> Type();
  4879.  
  4880.     //
  4881.     // Recall that the type is optional only when the compiler inserts
  4882.     // a CAST conversion node into the program.
  4883.     //
  4884.     AstPrimitiveType *primitive_type = cast_expression -> type_opt -> PrimitiveTypeCast();
  4885.     TypeSymbol *target_type;
  4886.     if (primitive_type)
  4887.          target_type = FindPrimitiveType(primitive_type);
  4888.     else if (cast_expression -> type_opt -> IsName())
  4889.          target_type = MustFindType(cast_expression -> type_opt);
  4890.     else
  4891.     {
  4892.         ReportSemError(SemanticError::INVALID_CAST_TYPE,
  4893.                        cast_expression -> type_opt -> LeftToken(),
  4894.                        cast_expression -> type_opt -> RightToken());
  4895.         cast_expression -> symbol = control.no_type;
  4896.  
  4897.         return;
  4898.     }
  4899.  
  4900.     int num_dimensions = cast_expression -> NumBrackets();
  4901.     target_type = (num_dimensions == 0 ? target_type : target_type -> GetArrayType((Semantic *) this, num_dimensions));
  4902.     
  4903.     if (CanAssignmentConvert(target_type, cast_expression -> expression))
  4904.     {
  4905.         cast_expression -> symbol = target_type;
  4906.         cast_expression -> value = CastValue(target_type, cast_expression -> expression);
  4907.     }
  4908.     else if (CanCastConvert(target_type, source_type, cast_expression -> right_parenthesis_token_opt))
  4909.     {
  4910.         cast_expression -> kind = Ast::CHECK_AND_CAST;
  4911.         cast_expression -> symbol = target_type;
  4912.         cast_expression -> value = CastValue(target_type, cast_expression -> expression);
  4913.     }
  4914.     else
  4915.     {
  4916.         ReportSemError(SemanticError::INVALID_CAST_CONVERSION,
  4917.                        cast_expression -> expression -> LeftToken(),
  4918.                        cast_expression -> expression -> RightToken(),
  4919.                        source_type -> Name(),
  4920.                        target_type -> Name());
  4921.         cast_expression -> symbol = control.no_type;
  4922.     }
  4923.  
  4924.     return;
  4925. }
  4926.  
  4927.  
  4928. AstExpression *Semantic::ConvertToType(AstExpression *expr, TypeSymbol *type)
  4929. {
  4930.     if (expr -> Type() == control.null_type)
  4931.         return expr;
  4932.  
  4933.     LexStream::TokenIndex loc = expr -> LeftToken();
  4934.  
  4935.     AstCastExpression *result = compilation_unit -> ast_pool -> GenCastExpression();
  4936.     result -> left_parenthesis_token_opt = loc;
  4937.     result -> type_opt = NULL;
  4938.     result -> right_parenthesis_token_opt = loc;
  4939.     result -> expression = expr;
  4940.  
  4941.     result -> symbol = type;
  4942.     result -> value = CastValue(type, expr);
  4943.  
  4944.     return result;
  4945. }
  4946.  
  4947.  
  4948. AstExpression *Semantic::PromoteUnaryNumericExpression(AstExpression *unary_expression)
  4949. {
  4950.     TypeSymbol *type = unary_expression -> Type();
  4951.  
  4952.     if (type == control.no_type)
  4953.         return unary_expression;
  4954.  
  4955.     if (! control.IsNumeric(type))
  4956.     {
  4957.        ReportSemError(SemanticError::TYPE_NOT_NUMERIC,
  4958.                       unary_expression -> LeftToken(),
  4959.                       unary_expression -> RightToken(),
  4960.                       type -> Name());
  4961.         unary_expression -> symbol = control.no_type;
  4962.         return unary_expression;
  4963.     }
  4964.  
  4965.     return ((type == control.byte_type || type == control.short_type || type == control.char_type)
  4966.                                                 ? ConvertToType(unary_expression, control.int_type)
  4967.                                                 : unary_expression);
  4968. }
  4969.  
  4970.  
  4971. void Semantic::BinaryNumericPromotion(AstBinaryExpression *binary_expression)
  4972. {
  4973.     AstExpression *left_expr = binary_expression -> left_expression;
  4974.     AstExpression *right_expr = binary_expression -> right_expression;
  4975.  
  4976.     TypeSymbol *left_type  = left_expr -> Type(),
  4977.                *right_type = right_expr -> Type();
  4978.  
  4979.     if (left_type == control.no_type || right_type == control.no_type)
  4980.     {
  4981.         binary_expression -> symbol = control.no_type;
  4982.         return;
  4983.     }
  4984.  
  4985.     if (! control.IsNumeric(left_type))
  4986.     {
  4987.        ReportSemError(SemanticError::TYPE_NOT_NUMERIC,
  4988.                       left_expr -> LeftToken(),
  4989.                       left_expr -> RightToken(),
  4990.                       left_type -> Name());
  4991.         binary_expression -> symbol = control.no_type;
  4992.         return;
  4993.     }
  4994.     else if (! control.IsNumeric(right_type))
  4995.     {
  4996.        ReportSemError(SemanticError::TYPE_NOT_NUMERIC,
  4997.                       right_expr -> LeftToken(),
  4998.                       right_expr -> RightToken(),
  4999.                       right_type -> Name());
  5000.         binary_expression -> symbol = control.no_type;
  5001.         return;
  5002.     }
  5003.  
  5004.     if (left_type == control.double_type)
  5005.     {
  5006.         if (right_type != control.double_type)
  5007.             binary_expression -> right_expression = ConvertToType(binary_expression -> right_expression, control.double_type);
  5008.         binary_expression -> symbol = control.double_type;
  5009.     }
  5010.     else if (right_type == control.double_type)
  5011.     {
  5012.         if (left_type != control.double_type)
  5013.             binary_expression -> left_expression = ConvertToType(binary_expression -> left_expression, control.double_type);
  5014.         binary_expression -> symbol = control.double_type;
  5015.     }
  5016.     else if (left_type == control.float_type)
  5017.     {
  5018.         if (right_type != control.float_type)
  5019.             binary_expression -> right_expression = ConvertToType(binary_expression -> right_expression, control.float_type);
  5020.         binary_expression -> symbol = control.float_type;
  5021.     }
  5022.     else if (right_type == control.float_type)
  5023.     {
  5024.         if (left_type != control.float_type)
  5025.             binary_expression -> left_expression = ConvertToType(binary_expression -> left_expression, control.float_type);
  5026.         binary_expression -> symbol = control.float_type;
  5027.     }
  5028.     else if (left_type == control.long_type)
  5029.     {
  5030.         if (right_type != control.long_type)
  5031.             binary_expression -> right_expression = ConvertToType(binary_expression -> right_expression, control.long_type);
  5032.         binary_expression -> symbol = control.long_type;
  5033.     }
  5034.     else if (right_type == control.long_type)
  5035.     {
  5036.         if (left_type != control.long_type)
  5037.             binary_expression -> left_expression = ConvertToType(binary_expression -> left_expression, control.long_type);
  5038.         binary_expression -> symbol = control.long_type;
  5039.     }
  5040.     else
  5041.     {
  5042.         if (left_type != control.int_type)
  5043.             binary_expression -> left_expression = ConvertToType(binary_expression -> left_expression, control.int_type);
  5044.         if (right_type != control.int_type)
  5045.             binary_expression -> right_expression = ConvertToType(binary_expression -> right_expression, control.int_type);
  5046.         binary_expression -> symbol = control.int_type;
  5047.     }
  5048.  
  5049.     return;
  5050. }
  5051.  
  5052.  
  5053. void Semantic::BinaryNumericPromotion(AstAssignmentExpression *assignment_expression)
  5054. {
  5055.     AstExpression *left_expr = assignment_expression -> left_hand_side;
  5056.     AstExpression *right_expr = assignment_expression -> expression;
  5057.  
  5058.     TypeSymbol *left_type  = left_expr -> Type(),
  5059.                *right_type = right_expr -> Type();
  5060.  
  5061.     if (left_type == control.no_type || right_type == control.no_type)
  5062.         return;
  5063.  
  5064.     if (! control.IsNumeric(left_type))
  5065.     {
  5066.        ReportSemError(SemanticError::TYPE_NOT_NUMERIC,
  5067.                       left_expr -> LeftToken(),
  5068.                       left_expr -> RightToken(),
  5069.                       left_type -> Name());
  5070.         return;
  5071.     }
  5072.     else if (! control.IsNumeric(right_type))
  5073.     {
  5074.        ReportSemError(SemanticError::TYPE_NOT_NUMERIC,
  5075.                       right_expr -> LeftToken(),
  5076.                       right_expr -> RightToken(),
  5077.                       right_type -> Name());
  5078.         return;
  5079.     }
  5080.  
  5081.     if (left_type == control.double_type)
  5082.     {
  5083.         if (right_type != control.double_type)
  5084.             assignment_expression -> expression = ConvertToType(assignment_expression -> expression, control.double_type);
  5085.     }
  5086.     else if (right_type == control.double_type)
  5087.     {
  5088.         if (left_type != control.double_type)
  5089.             assignment_expression -> left_hand_side = ConvertToType(assignment_expression -> left_hand_side, control.double_type);
  5090.     }   
  5091.     else if (left_type == control.float_type)
  5092.     {
  5093.         if (right_type != control.float_type)
  5094.             assignment_expression -> expression = ConvertToType(assignment_expression -> expression, control.float_type);
  5095.     }
  5096.     else if (right_type == control.float_type)
  5097.     {
  5098.         if (left_type != control.float_type)
  5099.             assignment_expression -> left_hand_side = ConvertToType(assignment_expression -> left_hand_side, control.float_type);
  5100.     }
  5101.     else if (left_type == control.long_type)
  5102.     {
  5103.         if (right_type != control.long_type)
  5104.             assignment_expression -> expression = ConvertToType(assignment_expression -> expression, control.long_type);
  5105.     }
  5106.     else if (right_type == control.long_type)
  5107.     {
  5108.         if (left_type != control.long_type)
  5109.             assignment_expression -> left_hand_side = ConvertToType(assignment_expression -> left_hand_side, control.long_type);
  5110.     }
  5111.     else
  5112.     {
  5113.         if (left_type != control.int_type)
  5114.             assignment_expression -> left_hand_side = ConvertToType(assignment_expression -> left_hand_side, control.int_type);
  5115.         if (right_type != control.int_type)
  5116.             assignment_expression -> expression = ConvertToType(assignment_expression -> expression, control.int_type);
  5117.     }
  5118.  
  5119.     return;
  5120. }
  5121.  
  5122.  
  5123. void Semantic::BinaryNumericPromotion(AstConditionalExpression *conditional_expression)
  5124. {
  5125.     AstExpression *left_expr = conditional_expression -> true_expression;
  5126.     AstExpression *right_expr = conditional_expression -> false_expression;
  5127.  
  5128.     TypeSymbol *left_type  = left_expr -> Type(),
  5129.                *right_type = right_expr -> Type();
  5130.  
  5131.     if (left_type == control.no_type || right_type == control.no_type)
  5132.     {
  5133.         conditional_expression -> symbol = control.no_type;
  5134.         return;
  5135.     }
  5136.  
  5137.     if (! control.IsNumeric(left_type))
  5138.     {
  5139.        ReportSemError(SemanticError::TYPE_NOT_NUMERIC,
  5140.                       left_expr -> LeftToken(),
  5141.                       left_expr -> RightToken(),
  5142.                       left_type -> Name());
  5143.         conditional_expression -> symbol = control.no_type;
  5144.         return;
  5145.     }
  5146.     else if (! control.IsNumeric(right_type))
  5147.     {
  5148.        ReportSemError(SemanticError::TYPE_NOT_NUMERIC,
  5149.                       right_expr -> LeftToken(),
  5150.                       right_expr -> RightToken(),
  5151.                       right_type -> Name());
  5152.         conditional_expression -> symbol = control.no_type;
  5153.         return;
  5154.     }
  5155.  
  5156.     if (left_type == control.double_type)
  5157.     {
  5158.         if (right_type != control.double_type)
  5159.             conditional_expression -> false_expression =
  5160.                         ConvertToType(conditional_expression -> false_expression, control.double_type);
  5161.         conditional_expression -> symbol = control.double_type;
  5162.     }
  5163.     else if (right_type == control.double_type)
  5164.     {
  5165.         if (left_type != control.double_type)
  5166.             conditional_expression -> true_expression =
  5167.                         ConvertToType(conditional_expression -> true_expression, control.double_type);
  5168.         conditional_expression -> symbol = control.double_type;
  5169.     }
  5170.     else if (left_type == control.float_type)
  5171.     {
  5172.         if (right_type != control.float_type)
  5173.             conditional_expression -> false_expression =
  5174.                         ConvertToType(conditional_expression -> false_expression, control.float_type);
  5175.         conditional_expression -> symbol = control.float_type;
  5176.     }
  5177.     else if (right_type == control.float_type)
  5178.     {
  5179.         if (left_type != control.float_type)
  5180.             conditional_expression -> true_expression =
  5181.                         ConvertToType(conditional_expression -> true_expression, control.float_type);
  5182.         conditional_expression -> symbol = control.float_type;
  5183.     }
  5184.     else if (left_type == control.long_type)
  5185.     {
  5186.         if (right_type != control.long_type)
  5187.             conditional_expression -> false_expression =
  5188.                         ConvertToType(conditional_expression -> false_expression, control.long_type);
  5189.         conditional_expression -> symbol = control.long_type;
  5190.     }
  5191.     else if (right_type == control.long_type)
  5192.     {
  5193.         if (left_type != control.long_type)
  5194.             conditional_expression -> true_expression = ConvertToType(conditional_expression -> true_expression, control.long_type);
  5195.         conditional_expression -> symbol = control.long_type;
  5196.     }
  5197.     else
  5198.     {
  5199.         if (left_type != control.int_type)
  5200.             conditional_expression -> true_expression = ConvertToType(conditional_expression -> true_expression, control.int_type);
  5201.         if (right_type != control.int_type)
  5202.             conditional_expression -> false_expression =
  5203.                         ConvertToType(conditional_expression -> false_expression, control.int_type);
  5204.         conditional_expression -> symbol = control.int_type;
  5205.     }
  5206.  
  5207.     return;
  5208. }
  5209.  
  5210.  
  5211. void Semantic::ProcessPLUS(AstBinaryExpression *expr)
  5212. {
  5213.     ProcessExpression(expr -> left_expression);
  5214.     ProcessExpression(expr -> right_expression);
  5215.  
  5216.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5217.                *right_type = expr -> right_expression -> Type();
  5218.  
  5219.     if (left_type == control.no_type || right_type == control.no_type)
  5220.         expr -> symbol = control.no_type;
  5221.     else if (left_type == control.String() || right_type == control.String())
  5222.     {
  5223.         //
  5224.         // This operation may throw OutOfMemoryException
  5225.         //
  5226.         SymbolSet *exception_set = TryExceptionTableStack().Top();
  5227.         if (exception_set)
  5228.         {
  5229.             exception_set -> AddElement(control.RuntimeException());
  5230.             exception_set -> AddElement(control.Error());
  5231.         }
  5232.  
  5233.         if (left_type != control.String())
  5234.         {
  5235.             AddStringConversionDependence(left_type, expr -> binary_operator_token);
  5236.             AstExpression *left_expression = expr -> left_expression;
  5237.             if (left_type == control.void_type)
  5238.                 ReportSemError(SemanticError::VOID_TO_STRING,
  5239.                                left_expression -> LeftToken(),
  5240.                                left_expression -> RightToken());
  5241.             expr -> left_expression = ConvertToType(left_expression, control.String());
  5242.             if (left_expression -> IsConstant())
  5243.                 expr -> left_expression -> value = CastPrimitiveValue(control.String(), left_expression);
  5244.         }
  5245.         else if (right_type != control.String())
  5246.         {
  5247.             AddStringConversionDependence(right_type, expr -> binary_operator_token);
  5248.             AstExpression *right_expression = expr -> right_expression;
  5249.             if (right_type == control.void_type)
  5250.                 ReportSemError(SemanticError::VOID_TO_STRING,
  5251.                                right_expression -> LeftToken(),
  5252.                                right_expression -> RightToken());
  5253.             expr -> right_expression = ConvertToType(right_expression, control.String());
  5254.             if (right_expression -> IsConstant())
  5255.                 expr -> right_expression -> value = CastPrimitiveValue(control.String(), right_expression);
  5256.         }
  5257.         AddDependence(ThisType(), control.StringBuffer(), expr -> binary_operator_token);
  5258.  
  5259.         //
  5260.         // If both subexpressions are strings constants, identify the result as
  5261.         // as a string constant, but do not perform the concatenation here. The
  5262.         // reason being that if we have a long expression of the form
  5263.         //
  5264.         //  s1 + s2 + ... + sn
  5265.         //
  5266.         // where each subexpression s(i) is a string constant, we want to perform
  5267.         // one concatenation and enter a single result into the constant pool instead
  5268.         // of n-1 subresults. See CheckStringConstant in lookup.cpp.
  5269.         //
  5270.  
  5271.         expr -> symbol = control.String();
  5272.     }
  5273.     else
  5274.     {
  5275.         BinaryNumericPromotion(expr);
  5276.  
  5277.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5278.         {
  5279.              if (expr -> Type() == control.double_type)
  5280.              {
  5281.                  DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  5282.                  DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  5283.  
  5284.                  expr -> value = control.double_pool.FindOrInsert(left -> value + right -> value);
  5285.              }
  5286.              else if (expr -> Type() == control.float_type)
  5287.              {
  5288.                  FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  5289.                  FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  5290.  
  5291.                  expr -> value = control.float_pool.FindOrInsert(left -> value + right -> value);
  5292.              }
  5293.              else if (expr -> Type() == control.long_type)
  5294.              {
  5295.                  LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5296.                  LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  5297.  
  5298.                  expr -> value = control.long_pool.FindOrInsert(left -> value + right -> value);
  5299.              }
  5300.              else // assert(expr -> Type() == control.int_type)
  5301.              {
  5302.                  IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5303.                  IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5304.  
  5305.                  expr -> value = control.int_pool.FindOrInsert(left -> value + right -> value);
  5306.              }
  5307.         }
  5308.     }
  5309.  
  5310.     return;
  5311. }
  5312.  
  5313.  
  5314. void Semantic::ProcessLEFT_SHIFT(AstBinaryExpression *expr)
  5315. {
  5316.     ProcessExpression(expr -> left_expression);
  5317.     ProcessExpression(expr -> right_expression);
  5318.  
  5319.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5320.                *right_type = expr -> right_expression -> Type();
  5321.  
  5322.     if (left_type == control.no_type || right_type == control.no_type)
  5323.         expr -> symbol = control.no_type;
  5324.     else if (! control.IsIntegral(left_type))
  5325.     {
  5326.         ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  5327.                        expr -> left_expression -> LeftToken(),
  5328.                        expr -> left_expression -> RightToken(),
  5329.                        left_type -> Name());
  5330.         expr -> symbol = control.no_type;
  5331.     }
  5332.     else if (! control.IsIntegral(right_type))
  5333.     {
  5334.         ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  5335.                        expr -> right_expression -> LeftToken(),
  5336.                        expr -> right_expression -> RightToken(),
  5337.                        right_type -> Name());
  5338.         expr -> symbol = control.no_type;
  5339.     }
  5340.     else
  5341.     {
  5342.         expr -> left_expression  = PromoteUnaryNumericExpression(expr -> left_expression);
  5343.         expr -> right_expression = PromoteUnaryNumericExpression(expr -> right_expression);
  5344.         if (expr -> right_expression -> Type() == control.long_type)
  5345.             expr -> right_expression = ConvertToType(expr -> right_expression, control.int_type);
  5346.         expr -> symbol = expr -> left_expression -> symbol;
  5347.  
  5348.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5349.         {
  5350.             if (expr -> Type() == control.long_type)
  5351.             {
  5352.                 LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5353.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5354.  
  5355.                 expr -> value = control.long_pool.FindOrInsert(left -> value << (right -> value & 0x3F));
  5356.             }
  5357.             else // assert(expr -> Type() == control.int_type)
  5358.             {
  5359.                 IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5360.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5361.  
  5362.                 expr -> value = control.int_pool.FindOrInsert(left -> value << (0x1F & right -> value));
  5363.             }
  5364.         }
  5365.     }
  5366.  
  5367.     return;
  5368. }
  5369.  
  5370.  
  5371. void Semantic::ProcessRIGHT_SHIFT(AstBinaryExpression *expr)
  5372. {
  5373.     ProcessExpression(expr -> left_expression);
  5374.     ProcessExpression(expr -> right_expression);
  5375.  
  5376.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5377.                *right_type = expr -> right_expression -> Type();
  5378.  
  5379.     if (left_type == control.no_type || right_type == control.no_type)
  5380.         expr -> symbol = control.no_type;
  5381.     else if (! control.IsIntegral(left_type))
  5382.     {
  5383.         ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  5384.                        expr -> left_expression -> LeftToken(),
  5385.                        expr -> left_expression -> RightToken(),
  5386.                        left_type -> Name());
  5387.         expr -> symbol = control.no_type;
  5388.     }
  5389.     else if (! control.IsIntegral(right_type))
  5390.     {
  5391.         ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  5392.                        expr -> right_expression -> LeftToken(),
  5393.                        expr -> right_expression -> RightToken(),
  5394.                        right_type -> Name());
  5395.         expr -> symbol = control.no_type;
  5396.     }
  5397.     else
  5398.     {
  5399.         expr -> left_expression  = PromoteUnaryNumericExpression(expr -> left_expression);
  5400.         expr -> right_expression = PromoteUnaryNumericExpression(expr -> right_expression);
  5401.         if (expr -> right_expression -> Type() == control.long_type)
  5402.             expr -> right_expression = ConvertToType(expr -> right_expression, control.int_type);
  5403.         expr -> symbol = expr -> left_expression -> symbol;
  5404.  
  5405.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5406.         {
  5407.             if (expr -> Type() == control.long_type)
  5408.             {
  5409.                 LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5410.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5411.  
  5412.                 expr -> value = control.long_pool.FindOrInsert(left -> value >> (right -> value & 0x3F));
  5413.             }
  5414.             else // assert(expr -> Type() == control.int_type)
  5415.             {
  5416.                 IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5417.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5418.  
  5419.                 expr -> value = control.int_pool.FindOrInsert(left -> value >> (0x1F & right -> value));
  5420.             }
  5421.         }
  5422.     }
  5423.  
  5424.     return;
  5425. }
  5426.  
  5427.  
  5428. void Semantic::ProcessUNSIGNED_RIGHT_SHIFT(AstBinaryExpression *expr)
  5429. {
  5430.     ProcessExpression(expr -> left_expression);
  5431.     ProcessExpression(expr -> right_expression);
  5432.  
  5433.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5434.                *right_type = expr -> right_expression -> Type();
  5435.  
  5436.     if (left_type == control.no_type || right_type == control.no_type)
  5437.         expr -> symbol = control.no_type;
  5438.     else if (! control.IsIntegral(left_type))
  5439.     {
  5440.         ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  5441.                        expr -> left_expression -> LeftToken(),
  5442.                        expr -> left_expression -> RightToken(),
  5443.                        left_type -> Name());
  5444.         expr -> symbol = control.no_type;
  5445.     }
  5446.     else if (! control.IsIntegral(right_type))
  5447.     {
  5448.         ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  5449.                        expr -> right_expression -> LeftToken(),
  5450.                        expr -> right_expression -> RightToken(),
  5451.                        right_type -> Name());
  5452.         expr -> symbol = control.no_type;
  5453.     }
  5454.     else
  5455.     {
  5456.         expr -> left_expression  = PromoteUnaryNumericExpression(expr -> left_expression);
  5457.         expr -> right_expression = PromoteUnaryNumericExpression(expr -> right_expression);
  5458.         if (expr -> right_expression -> Type() == control.long_type)
  5459.             expr -> right_expression = ConvertToType(expr -> right_expression, control.int_type);
  5460.         expr -> symbol = expr -> left_expression -> symbol;
  5461.  
  5462.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5463.         {
  5464.             if (expr -> Type() == control.long_type)
  5465.             {
  5466.                 LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5467.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5468.                 int right_value = right -> value & 0x3F;
  5469.  
  5470.                 LongInt value = left -> value >> right_value;
  5471.                 if (left -> value < 0)
  5472.                     value += (LongInt(2) << (63 - right_value));
  5473.                 expr -> value = control.long_pool.FindOrInsert(value);
  5474.             }
  5475.             else // assert(expr -> Type() == control.int_type)
  5476.             {
  5477.                 IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5478.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5479.  
  5480.                 int value = left -> value >> (0x1F & right -> value);
  5481.                 if (left -> value < 0)
  5482.                      value += (2 << (31 - (0x1F & right -> value)));
  5483.                 expr -> value = control.int_pool.FindOrInsert(value);
  5484.             }
  5485.         }
  5486.     }
  5487.  
  5488.     return;
  5489. }
  5490.  
  5491.  
  5492. void Semantic::ProcessLESS(AstBinaryExpression *expr)
  5493. {
  5494.     ProcessExpression(expr -> left_expression);
  5495.     ProcessExpression(expr -> right_expression);
  5496.  
  5497.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5498.                *right_type = expr -> right_expression -> Type();
  5499.  
  5500.     if (left_type != control.no_type && right_type != control.no_type)
  5501.     {
  5502.         BinaryNumericPromotion(expr);
  5503.  
  5504.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5505.         {
  5506.             if (expr -> Type() == control.double_type)
  5507.             {
  5508.                 DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  5509.                 DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  5510.  
  5511.                 expr -> value = control.int_pool.FindOrInsert(left -> value < right -> value ? 1 : 0);
  5512.             }
  5513.             else if (expr -> Type() == control.float_type)
  5514.             {
  5515.                 FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  5516.                 FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  5517.  
  5518.                 expr -> value = control.int_pool.FindOrInsert(left -> value < right -> value ? 1 : 0);
  5519.             }
  5520.             else if (expr -> Type() == control.long_type)
  5521.            {
  5522.                 LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5523.                 LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  5524.  
  5525.                 expr -> value = control.int_pool.FindOrInsert(left -> value < right -> value ? 1 : 0);
  5526.             }
  5527.             else // assert(expr -> Type() == control.int_type)
  5528.             {
  5529.                 IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5530.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5531.  
  5532.                 expr -> value = control.int_pool.FindOrInsert(left -> value < right -> value ? 1 : 0);
  5533.             }
  5534.         }
  5535.     }
  5536.  
  5537.     expr -> symbol = control.boolean_type;
  5538.  
  5539.     return;
  5540. }
  5541.  
  5542.  
  5543. void Semantic::ProcessGREATER(AstBinaryExpression *expr)
  5544. {
  5545.     ProcessExpression(expr -> left_expression);
  5546.     ProcessExpression(expr -> right_expression);
  5547.  
  5548.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5549.                *right_type = expr -> right_expression -> Type();
  5550.  
  5551.     if (left_type != control.no_type && right_type != control.no_type)
  5552.     {
  5553.         BinaryNumericPromotion(expr);
  5554.  
  5555.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5556.         {
  5557.             if (expr -> Type() == control.double_type)
  5558.             {
  5559.                 DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  5560.                 DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  5561.  
  5562.                 expr -> value = control.int_pool.FindOrInsert(left -> value > right -> value ? 1 : 0);
  5563.             }
  5564.             else if (expr -> Type() == control.float_type)
  5565.             {
  5566.                 FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  5567.                 FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  5568.  
  5569.                 expr -> value = control.int_pool.FindOrInsert(left -> value > right -> value ? 1 : 0);
  5570.             }
  5571.             else if (expr -> Type() == control.long_type)
  5572.             {
  5573.                 LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5574.                 LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  5575.  
  5576.                 expr -> value = control.int_pool.FindOrInsert(left -> value > right -> value ? 1 : 0);
  5577.             }
  5578.             else // assert(expr -> Type() == control.int_type)
  5579.             {
  5580.                 IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5581.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5582.  
  5583.                 expr -> value = control.int_pool.FindOrInsert(left -> value > right -> value ? 1 : 0);
  5584.             }
  5585.         }
  5586.     }
  5587.  
  5588.     expr -> symbol = control.boolean_type;
  5589.  
  5590.     return;
  5591. }
  5592.  
  5593.  
  5594. void Semantic::ProcessLESS_EQUAL(AstBinaryExpression *expr)
  5595. {
  5596.     ProcessExpression(expr -> left_expression);
  5597.     ProcessExpression(expr -> right_expression);
  5598.  
  5599.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5600.                *right_type = expr -> right_expression -> Type();
  5601.  
  5602.     if (left_type != control.no_type && right_type != control.no_type)
  5603.     {
  5604.         BinaryNumericPromotion(expr);
  5605.  
  5606.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5607.         {
  5608.             if (expr -> Type() == control.double_type)
  5609.             {
  5610.                 DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  5611.                 DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  5612.  
  5613.                 expr -> value = control.int_pool.FindOrInsert(left -> value <= right -> value ? 1 : 0);
  5614.             }
  5615.             else if (expr -> Type() == control.float_type)
  5616.             {
  5617.                 FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  5618.                 FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  5619.  
  5620.                 expr -> value = control.int_pool.FindOrInsert(left -> value <= right -> value ? 1 : 0);
  5621.             }
  5622.             else if (expr -> Type() == control.long_type)
  5623.             {
  5624.                 LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5625.                 LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  5626.  
  5627.                 expr -> value = control.int_pool.FindOrInsert(left -> value <= right -> value ? 1 : 0);
  5628.             }
  5629.             else // assert(expr -> Type() == control.int_type)
  5630.             {
  5631.                 IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5632.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5633.  
  5634.                 expr -> value = control.int_pool.FindOrInsert(left -> value <= right -> value ? 1 : 0);
  5635.             }
  5636.         }
  5637.     }
  5638.  
  5639.     expr -> symbol = control.boolean_type;
  5640.  
  5641.     return;
  5642. }
  5643.  
  5644.  
  5645. void Semantic::ProcessGREATER_EQUAL(AstBinaryExpression *expr)
  5646. {
  5647.     ProcessExpression(expr -> left_expression);
  5648.     ProcessExpression(expr -> right_expression);
  5649.  
  5650.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5651.                *right_type = expr -> right_expression -> Type();
  5652.  
  5653.     if (left_type != control.no_type && right_type != control.no_type)
  5654.     {
  5655.         BinaryNumericPromotion(expr);
  5656.  
  5657.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5658.         {
  5659.             if (expr -> Type() == control.double_type)
  5660.             {
  5661.                 DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  5662.                 DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  5663.  
  5664.                 expr -> value = control.int_pool.FindOrInsert(left -> value >= right -> value ? 1 : 0);
  5665.             }
  5666.             else if (expr -> Type() == control.float_type)
  5667.             {
  5668.                 FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  5669.                 FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  5670.  
  5671.                 expr -> value = control.int_pool.FindOrInsert(left -> value >= right -> value ? 1 : 0);
  5672.             }
  5673.             else if (expr -> Type() == control.long_type)
  5674.             {
  5675.                 LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5676.                 LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  5677.  
  5678.                 expr -> value = control.int_pool.FindOrInsert(left -> value >= right -> value ? 1 : 0);
  5679.             }
  5680.             else // assert(expr -> Type() == control.int_type)
  5681.             {
  5682.                 IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5683.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5684.  
  5685.                 expr -> value = control.int_pool.FindOrInsert(left -> value >= right -> value ? 1 : 0);
  5686.             }
  5687.         }
  5688.     }
  5689.  
  5690.     expr -> symbol = control.boolean_type;
  5691.  
  5692.     return;
  5693. }
  5694.  
  5695.  
  5696. void Semantic::ProcessAND(AstBinaryExpression *expr)
  5697. {
  5698.     ProcessExpression(expr -> left_expression);
  5699.     ProcessExpression(expr -> right_expression);
  5700.  
  5701.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5702.                *right_type = expr -> right_expression -> Type();
  5703.  
  5704.     if (left_type == control.no_type || right_type == control.no_type)
  5705.         expr -> symbol = control.no_type;
  5706.     else
  5707.     {
  5708.         if (left_type == control.boolean_type && right_type == control.boolean_type)
  5709.              expr -> symbol = control.boolean_type;
  5710.         else
  5711.         {
  5712.             BinaryNumericPromotion(expr);
  5713.  
  5714.             TypeSymbol *expr_type = expr -> Type();
  5715.  
  5716.             if (expr_type != control.no_type)
  5717.             {
  5718.                 if (! control.IsIntegral(expr_type))
  5719.                 {
  5720.                     ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  5721.                                    expr -> LeftToken(),
  5722.                                    expr -> RightToken(),
  5723.                                    expr_type -> Name());
  5724.                     expr -> symbol = control.no_type;
  5725.                 }
  5726.                 else if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5727.                 {
  5728.                     if (expr_type == control.long_type)
  5729.                     {
  5730.                         LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5731.                         LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  5732.  
  5733.                         expr -> value = control.long_pool.FindOrInsert(left -> value & right -> value);
  5734.                     }
  5735.                     else // assert(expr_type == control.int_type)
  5736.                     {
  5737.                         IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5738.                         IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5739.  
  5740.                         expr -> value = control.int_pool.FindOrInsert(left -> value & right -> value);
  5741.                     }
  5742.                 }
  5743.             }
  5744.         }
  5745.     }
  5746.  
  5747.     return;
  5748. }
  5749.  
  5750.  
  5751. void Semantic::ProcessXOR(AstBinaryExpression *expr)
  5752. {
  5753.     ProcessExpression(expr -> left_expression);
  5754.     ProcessExpression(expr -> right_expression);
  5755.  
  5756.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5757.                *right_type = expr -> right_expression -> Type();
  5758.  
  5759.     if (left_type == control.no_type || right_type == control.no_type)
  5760.         expr -> symbol = control.no_type;
  5761.     else
  5762.     {
  5763.         if (left_type == control.boolean_type && right_type == control.boolean_type)
  5764.              expr -> symbol = control.boolean_type;
  5765.         else
  5766.         {
  5767.             BinaryNumericPromotion(expr);
  5768.  
  5769.             TypeSymbol *expr_type = expr -> Type();
  5770.  
  5771.             if (expr_type != control.no_type)
  5772.             {
  5773.                 if (! control.IsIntegral(expr_type))
  5774.                 {
  5775.                     ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  5776.                                    expr -> LeftToken(),
  5777.                                    expr -> RightToken(),
  5778.                                    expr_type -> Name());
  5779.                     expr -> symbol = control.no_type;
  5780.                 }
  5781.                 else if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5782.                 {
  5783.                     if (expr_type == control.long_type)
  5784.                     {
  5785.                         LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5786.                         LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  5787.  
  5788.                         expr -> value = control.long_pool.FindOrInsert(left -> value ^ right -> value);
  5789.                     }
  5790.                     else // assert(expr_type == control.int_type)
  5791.                     {
  5792.                         IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5793.                         IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5794.  
  5795.                         expr -> value = control.int_pool.FindOrInsert(left -> value ^ right -> value);
  5796.                     }
  5797.                 }
  5798.             }
  5799.         }
  5800.     }
  5801.  
  5802.     return;
  5803. }
  5804.  
  5805.  
  5806. void Semantic::ProcessIOR(AstBinaryExpression *expr)
  5807. {
  5808.     ProcessExpression(expr -> left_expression);
  5809.     ProcessExpression(expr -> right_expression);
  5810.  
  5811.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5812.                *right_type = expr -> right_expression -> Type();
  5813.  
  5814.     if (left_type == control.no_type || right_type == control.no_type)
  5815.         expr -> symbol = control.no_type;
  5816.     else
  5817.     {
  5818.         if (left_type == control.boolean_type && right_type == control.boolean_type)
  5819.              expr -> symbol = control.boolean_type;
  5820.         else
  5821.         {
  5822.             BinaryNumericPromotion(expr);
  5823.  
  5824.             TypeSymbol *expr_type = expr -> Type();
  5825.  
  5826.             if (expr_type != control.no_type)
  5827.             {
  5828.                 if (! control.IsIntegral(expr_type))
  5829.                 {
  5830.                     ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  5831.                                    expr -> LeftToken(),
  5832.                                    expr -> RightToken(),
  5833.                                    expr_type -> Name());
  5834.                     expr -> symbol = control.no_type;
  5835.                 }
  5836.                 else if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5837.                 {
  5838.                     if (expr_type == control.long_type)
  5839.                     {
  5840.                         LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  5841.                         LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  5842.  
  5843.                         expr -> value = control.long_pool.FindOrInsert(left -> value | right -> value);
  5844.                     }
  5845.                     else // assert(expr_type == control.int_type)
  5846.                     {
  5847.                         IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5848.                         IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5849.  
  5850.                         expr -> value = control.int_pool.FindOrInsert(left -> value | right -> value);
  5851.                     }
  5852.                 }
  5853.             }
  5854.         }
  5855.     }
  5856.  
  5857.     return;
  5858. }
  5859.  
  5860.  
  5861. void Semantic::ProcessAND_AND(AstBinaryExpression *expr)
  5862. {
  5863.     ProcessExpression(expr -> left_expression);
  5864.     ProcessExpression(expr -> right_expression);
  5865.  
  5866.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5867.                *right_type = expr -> right_expression -> Type();
  5868.  
  5869.     if (left_type != control.no_type && right_type != control.no_type)
  5870.     {
  5871.         if (left_type != control.boolean_type)
  5872.         {
  5873.             ReportSemError(SemanticError::TYPE_NOT_BOOLEAN,
  5874.                            expr -> left_expression -> LeftToken(),
  5875.                            expr -> left_expression -> RightToken(),
  5876.                            left_type -> Name());
  5877.         }
  5878.         else if (right_type != control.boolean_type)
  5879.         {
  5880.             ReportSemError(SemanticError::TYPE_NOT_BOOLEAN,
  5881.                            expr -> right_expression -> LeftToken(),
  5882.                            expr -> right_expression -> RightToken(),
  5883.                            right_type -> Name());
  5884.         }
  5885.         else if (expr -> left_expression -> IsConstant())
  5886.         {
  5887.             IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5888.             if (! left -> value)
  5889.                 expr -> value = control.int_pool.FindOrInsert(0);
  5890.             else if (expr -> right_expression -> IsConstant())
  5891.             {
  5892.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5893.                 expr -> value = control.int_pool.FindOrInsert(left -> value && right -> value ? 1 : 0);
  5894.             }
  5895.         }
  5896.     }
  5897.  
  5898.     expr -> symbol = control.boolean_type;
  5899.  
  5900.     return;
  5901. }
  5902.  
  5903.  
  5904. void Semantic::ProcessOR_OR(AstBinaryExpression *expr)
  5905. {
  5906.     ProcessExpression(expr -> left_expression);
  5907.     ProcessExpression(expr -> right_expression);
  5908.  
  5909.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5910.                *right_type = expr -> right_expression -> Type();
  5911.  
  5912.     if (left_type != control.no_type && right_type != control.no_type)
  5913.     {
  5914.         if (left_type != control.boolean_type)
  5915.         {
  5916.             ReportSemError(SemanticError::TYPE_NOT_BOOLEAN,
  5917.                            expr -> left_expression -> LeftToken(),
  5918.                            expr -> left_expression -> RightToken(),
  5919.                            left_type -> Name());
  5920.         }
  5921.         else if (right_type != control.boolean_type)
  5922.         {
  5923.             ReportSemError(SemanticError::TYPE_NOT_BOOLEAN,
  5924.                            expr -> right_expression -> LeftToken(),
  5925.                            expr -> right_expression -> RightToken(),
  5926.                            right_type -> Name());
  5927.         }
  5928.         else if (expr -> left_expression -> IsConstant())
  5929.         {
  5930.             IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  5931.             if (left -> value)
  5932.                 expr -> value = control.int_pool.FindOrInsert(1);
  5933.             else if (expr -> right_expression -> IsConstant())
  5934.             {
  5935.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  5936.                 expr -> value = control.int_pool.FindOrInsert(left -> value || right -> value ? 1 : 0);
  5937.             }
  5938.         }
  5939.     }
  5940.  
  5941.     expr -> symbol = control.boolean_type;
  5942.  
  5943.     return;
  5944. }
  5945.  
  5946.  
  5947. void Semantic::ProcessEQUAL_EQUAL(AstBinaryExpression *expr)
  5948. {
  5949.     ProcessExpressionOrStringConstant(expr -> left_expression);
  5950.     ProcessExpressionOrStringConstant(expr -> right_expression);
  5951.  
  5952.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  5953.                *right_type = expr -> right_expression -> Type();
  5954.  
  5955.     if (left_type != control.no_type && right_type != control.no_type)
  5956.     {
  5957.         if (left_type != right_type)
  5958.         {
  5959.             if (left_type -> Primitive() && right_type -> Primitive())
  5960.                  BinaryNumericPromotion(expr);
  5961.             else if (CanCastConvert(left_type, right_type, expr -> binary_operator_token))
  5962.                  expr -> right_expression = ConvertToType(expr -> right_expression, left_type);
  5963.             else if (CanCastConvert(right_type, left_type, expr -> binary_operator_token))
  5964.                  expr -> left_expression = ConvertToType(expr -> left_expression, right_type);
  5965.             else
  5966.             {
  5967.                 ReportSemError(SemanticError::INCOMPATIBLE_TYPE_FOR_BINARY_EXPRESSION,
  5968.                                expr -> LeftToken(),
  5969.                                expr -> RightToken(),
  5970.                                expr -> left_expression -> Type() -> ContainingPackage() -> PackageName(),
  5971.                                expr -> left_expression -> Type() -> ExternalName(),
  5972.                                expr -> right_expression -> Type() -> ContainingPackage() -> PackageName(),
  5973.                                expr -> right_expression -> Type() -> ExternalName());
  5974.             }
  5975.         }
  5976.         else 
  5977.         {
  5978.             if (left_type == control.void_type)
  5979.                 ReportSemError(SemanticError::VOID_TYPE_IN_EQUALITY_EXPRESSION,
  5980.                                expr -> LeftToken(),
  5981.                                expr -> RightToken(),
  5982.                                expr -> left_expression -> Type() -> Name(),
  5983.                                expr -> right_expression -> Type() -> Name());
  5984.             expr -> symbol = left_type;
  5985.         }
  5986.  
  5987.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  5988.         {
  5989.             LiteralValue *left = expr -> left_expression -> value;
  5990.             LiteralValue *right = expr -> right_expression -> value;
  5991.  
  5992.             if (expr -> Type() == control.double_type)
  5993.             {
  5994.                 DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  5995.                 DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  5996.  
  5997.                 expr -> value = control.int_pool.FindOrInsert(left -> value == right -> value ? 1 : 0);
  5998.             }
  5999.             else if (expr -> Type() == control.float_type)
  6000.             {
  6001.                 FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  6002.                 FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  6003.  
  6004.                 expr -> value = control.int_pool.FindOrInsert(left -> value == right -> value ? 1 : 0);
  6005.             }
  6006.             else expr -> value = control.int_pool.FindOrInsert(left == right ? 1 : 0);
  6007.         }
  6008.     }
  6009.  
  6010.     expr -> symbol = control.boolean_type;
  6011.  
  6012.     return;
  6013. }
  6014.  
  6015.  
  6016. void Semantic::ProcessNOT_EQUAL(AstBinaryExpression *expr)
  6017. {
  6018.     ProcessExpressionOrStringConstant(expr -> left_expression);
  6019.     ProcessExpressionOrStringConstant(expr -> right_expression);
  6020.  
  6021.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  6022.                *right_type = expr -> right_expression -> Type();
  6023.  
  6024.     if (left_type != control.no_type && right_type != control.no_type)
  6025.     {
  6026.         if (left_type != right_type)
  6027.         {
  6028.             if (left_type -> Primitive() && right_type -> Primitive())
  6029.                  BinaryNumericPromotion(expr);
  6030.             else if (CanCastConvert(left_type, right_type, expr -> binary_operator_token))
  6031.                  expr -> right_expression = ConvertToType(expr -> right_expression, left_type);
  6032.             else if (CanCastConvert(right_type, left_type, expr -> binary_operator_token))
  6033.                  expr -> left_expression = ConvertToType(expr -> left_expression, right_type);
  6034.             else
  6035.             {
  6036.                 ReportSemError(SemanticError::INCOMPATIBLE_TYPE_FOR_BINARY_EXPRESSION,
  6037.                                expr -> LeftToken(),
  6038.                                expr -> RightToken(),
  6039.                                expr -> left_expression -> Type() -> ContainingPackage() -> PackageName(),
  6040.                                expr -> left_expression -> Type() -> ExternalName(),
  6041.                                expr -> right_expression -> Type() -> ContainingPackage() -> PackageName(),
  6042.                                expr -> right_expression -> Type() -> ExternalName());
  6043.             }
  6044.         }
  6045.         else 
  6046.         {
  6047.             if (left_type == control.void_type)
  6048.                 ReportSemError(SemanticError::VOID_TYPE_IN_EQUALITY_EXPRESSION,
  6049.                                expr -> LeftToken(),
  6050.                                expr -> RightToken());
  6051.             expr -> symbol = left_type;
  6052.         }
  6053.  
  6054.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  6055.         {
  6056.             LiteralValue *left = expr -> left_expression -> value;
  6057.             LiteralValue *right = expr -> right_expression -> value;
  6058.  
  6059.             if (expr -> Type() == control.double_type)
  6060.             {
  6061.                 DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  6062.                 DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  6063.  
  6064.                 expr -> value = control.int_pool.FindOrInsert(left -> value != right -> value ? 1 : 0);
  6065.             }
  6066.             else if (expr -> Type() == control.float_type)
  6067.             {
  6068.                 FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  6069.                 FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  6070.  
  6071.                 expr -> value = control.int_pool.FindOrInsert(left -> value != right -> value ? 1 : 0);
  6072.             }
  6073.             else expr -> value = control.int_pool.FindOrInsert(left != right ? 1 : 0);
  6074.         }
  6075.     }
  6076.  
  6077.     expr -> symbol = control.boolean_type;
  6078.  
  6079.     return;
  6080. }
  6081.  
  6082.  
  6083. void Semantic::ProcessSTAR(AstBinaryExpression *expr)
  6084. {
  6085.     ProcessExpression(expr -> left_expression);
  6086.     ProcessExpression(expr -> right_expression);
  6087.  
  6088.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  6089.                *right_type = expr -> right_expression -> Type();
  6090.  
  6091.     if (left_type == control.no_type || right_type == control.no_type)
  6092.         expr -> symbol = control.no_type;
  6093.     else
  6094.     {
  6095.         BinaryNumericPromotion(expr);
  6096.  
  6097.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  6098.         {
  6099.             if (expr -> Type() == control.double_type)
  6100.             {
  6101.                 DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  6102.                 DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  6103.  
  6104.                 expr -> value = control.double_pool.FindOrInsert(left -> value * right -> value);
  6105.             }
  6106.             else if (expr -> Type() == control.float_type)
  6107.             {
  6108.                 FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  6109.                 FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  6110.  
  6111.                 expr -> value = control.float_pool.FindOrInsert(left -> value * right -> value);
  6112.             }
  6113.             else if (expr -> Type() == control.long_type)
  6114.             {
  6115.                 LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  6116.                 LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  6117.  
  6118.                 expr -> value = control.long_pool.FindOrInsert(left -> value * right -> value);
  6119.             }
  6120.             else if (expr -> Type() == control.int_type)
  6121.             {
  6122.                 IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  6123.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  6124.  
  6125.                 expr -> value = control.int_pool.FindOrInsert(left -> value * right -> value);
  6126.             }
  6127.         }
  6128.     }
  6129.  
  6130.     return;
  6131. }
  6132.  
  6133.  
  6134. void Semantic::ProcessMINUS(AstBinaryExpression *expr)
  6135. {
  6136.     ProcessExpression(expr -> left_expression);
  6137.     ProcessExpression(expr -> right_expression);
  6138.  
  6139.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  6140.                *right_type = expr -> right_expression -> Type();
  6141.  
  6142.     if (left_type == control.no_type || right_type == control.no_type)
  6143.         expr -> symbol = control.no_type;
  6144.     else
  6145.     {
  6146.         BinaryNumericPromotion(expr);
  6147.  
  6148.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  6149.         {
  6150.             if (expr -> Type() == control.double_type)
  6151.             {
  6152.                 DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  6153.                 DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  6154.  
  6155.                 expr -> value = control.double_pool.FindOrInsert(left -> value - right -> value);
  6156.             }
  6157.             else if (expr -> Type() == control.float_type)
  6158.             {
  6159.                 FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  6160.                 FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  6161.  
  6162.                 expr -> value = control.float_pool.FindOrInsert(left -> value - right -> value);
  6163.             }
  6164.             else if (expr -> Type() == control.long_type)
  6165.             {
  6166.                 LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  6167.                 LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  6168.  
  6169.                 expr -> value = control.long_pool.FindOrInsert(left -> value - right -> value);
  6170.             }
  6171.             else if (expr -> Type() == control.int_type)
  6172.             {
  6173.                 IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  6174.                 IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  6175.  
  6176.                 expr -> value = control.int_pool.FindOrInsert(left -> value - right -> value);
  6177.             }
  6178.         }
  6179.     }
  6180.  
  6181.     return;
  6182. }
  6183.  
  6184.  
  6185. void Semantic::ProcessSLASH(AstBinaryExpression *expr)
  6186. {
  6187.     ProcessExpression(expr -> left_expression);
  6188.     ProcessExpression(expr -> right_expression);
  6189.  
  6190.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  6191.                *right_type = expr -> right_expression -> Type();
  6192.  
  6193.     if (left_type == control.no_type || right_type == control.no_type)
  6194.         expr -> symbol = control.no_type;
  6195.     else
  6196.     {
  6197.         BinaryNumericPromotion(expr);
  6198.  
  6199.         //
  6200.         // This operation may throw ArithmeticException
  6201.         //
  6202.         SymbolSet *exception_set = TryExceptionTableStack().Top();
  6203.         if (exception_set)
  6204.         {
  6205.             exception_set -> AddElement(control.RuntimeException());
  6206.             exception_set -> AddElement(control.Error());
  6207.         }
  6208.  
  6209.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  6210.         {
  6211.              if (expr -> Type() == control.double_type)
  6212.              {
  6213.                  DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  6214.                  DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  6215.  
  6216.                  expr -> value = control.double_pool.FindOrInsert(left -> value / right -> value);
  6217.              }
  6218.              else if (expr -> Type() == control.float_type)
  6219.              {
  6220.                  FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  6221.                  FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  6222.  
  6223.                  expr -> value = control.float_pool.FindOrInsert(left -> value / right -> value);
  6224.              }
  6225.              else if (expr -> Type() == control.long_type)
  6226.              {
  6227.                  LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  6228.                  LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  6229.  
  6230.                  if (right -> value == 0)
  6231.                  {
  6232.                      ReportSemError(SemanticError::ZERO_DIVIDE,
  6233.                                     expr -> LeftToken(),
  6234.                                     expr -> RightToken());
  6235.                  }
  6236.                  else expr -> value = control.long_pool.FindOrInsert(left -> value / right -> value);
  6237.              }
  6238.              else if (expr -> Type() == control.int_type)
  6239.              {
  6240.                  IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  6241.                  IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  6242.  
  6243.                  if (right -> value == 0)
  6244.                  {
  6245.                      ReportSemError(SemanticError::ZERO_DIVIDE,
  6246.                                     expr -> LeftToken(),
  6247.                                     expr -> RightToken());
  6248.                  }
  6249. //
  6250. // There is a bug in the intel hardware where if one tries to compute ((2**32-1) / -1), he gets a ZeroDivide exception.
  6251. // Thus, instead of using the straightforward code below, we use the short-circuited one that follows:
  6252. //
  6253. //                 else expr -> value = control.int_pool.FindOrInsert(left -> value / right -> value);
  6254. //
  6255.                  else expr -> value = control.int_pool.FindOrInsert(right -> value == -1 ? -(left -> value)
  6256.                                                                                          : left -> value / right -> value);
  6257.              }
  6258.         }
  6259.     }
  6260.  
  6261.     return;
  6262. }
  6263.  
  6264.  
  6265. void Semantic::ProcessMOD(AstBinaryExpression *expr)
  6266. {
  6267.     ProcessExpression(expr -> left_expression);
  6268.     ProcessExpression(expr -> right_expression);
  6269.  
  6270.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  6271.                *right_type = expr -> right_expression -> Type();
  6272.  
  6273.     if (left_type == control.no_type || right_type == control.no_type)
  6274.         expr -> symbol = control.no_type;
  6275.     else
  6276.     {
  6277.         BinaryNumericPromotion(expr);
  6278.  
  6279.         //
  6280.         // This operation may throw ArithmeticException
  6281.         //
  6282.         SymbolSet *exception_set = TryExceptionTableStack().Top();
  6283.         if (exception_set)
  6284.         {
  6285.             exception_set -> AddElement(control.RuntimeException());
  6286.             exception_set -> AddElement(control.Error());
  6287.         }
  6288.  
  6289.         if (expr -> left_expression -> IsConstant() && expr -> right_expression -> IsConstant())
  6290.         {
  6291.              if (expr -> Type() == control.double_type)
  6292.              {
  6293.                  DoubleLiteralValue *left = (DoubleLiteralValue *) expr -> left_expression -> value;
  6294.                  DoubleLiteralValue *right = (DoubleLiteralValue *) expr -> right_expression -> value;
  6295.                  IEEEdouble result =  IEEEdouble((u4) 0);
  6296.                  IEEEdouble::Fmodulus(left -> value, right -> value, result);
  6297.  
  6298.                  expr -> value = control.double_pool.FindOrInsert(result);
  6299.              }
  6300.              else if (expr -> Type() == control.float_type)
  6301.              {
  6302.                  FloatLiteralValue *left = (FloatLiteralValue *) expr -> left_expression -> value;
  6303.                  FloatLiteralValue *right = (FloatLiteralValue *) expr -> right_expression -> value;
  6304.                  IEEEfloat result = IEEEfloat(0);
  6305.                  IEEEfloat::Fmodulus(left -> value, right -> value, result);
  6306.  
  6307.                  expr -> value = control.float_pool.FindOrInsert(result);
  6308.              }
  6309.              else if (expr -> Type() == control.long_type)
  6310.              {
  6311.                  LongLiteralValue *left = (LongLiteralValue *) expr -> left_expression -> value;
  6312.                  LongLiteralValue *right = (LongLiteralValue *) expr -> right_expression -> value;
  6313.  
  6314.                  if (right -> value == 0)
  6315.                  {
  6316.                      ReportSemError(SemanticError::ZERO_DIVIDE,
  6317.                                     expr -> LeftToken(),
  6318.                                     expr -> RightToken());
  6319.                  }
  6320.                  else expr -> value = control.long_pool.FindOrInsert(left -> value % right -> value);
  6321.              }
  6322.              else if (expr -> Type() == control.int_type)
  6323.              {
  6324.                  IntLiteralValue *left = (IntLiteralValue *) expr -> left_expression -> value;
  6325.                  IntLiteralValue *right = (IntLiteralValue *) expr -> right_expression -> value;
  6326.  
  6327.                  if (right -> value == 0)
  6328.                  {
  6329.                      ReportSemError(SemanticError::ZERO_DIVIDE,
  6330.                                     expr -> LeftToken(),
  6331.                                     expr -> RightToken());
  6332.                  }
  6333. //
  6334. // There is a bug in the intel hardware where if one tries to compute ((2**32-1) / -1), he gets a ZeroDivide exception.
  6335. // Thus, instead of using the straightforward code below, we use the short-circuited one that follows:
  6336. //
  6337. //                 else expr -> value = control.int_pool.FindOrInsert(left -> value % right -> value);
  6338. //
  6339.                  else expr -> value = control.int_pool.FindOrInsert((left -> value  == (signed) 0x80000000 &&
  6340.                                                                      right -> value == (signed) 0xffffffff)
  6341.                                                                                      ? 0
  6342.                                                                                      : left -> value % right -> value);
  6343.              }
  6344.          }
  6345.     }
  6346.  
  6347.     return;
  6348. }
  6349.  
  6350.  
  6351. void Semantic::ProcessINSTANCEOF(AstBinaryExpression *expr)
  6352. {
  6353.     ProcessExpression(expr -> left_expression);
  6354.     ProcessExpression(expr -> right_expression);
  6355.  
  6356.     TypeSymbol *left_type  = expr -> left_expression -> Type(),
  6357.                *right_type = expr -> right_expression -> Type();
  6358.  
  6359.     if (left_type -> Primitive())
  6360.     {
  6361.         ReportSemError(SemanticError::TYPE_NOT_REFERENCE,
  6362.                        expr -> left_expression -> LeftToken(),
  6363.                        expr -> left_expression -> RightToken(),
  6364.                        expr -> left_expression -> Type() -> Name());
  6365.     }
  6366.     else if (! CanCastConvert(right_type, left_type, expr -> binary_operator_token)) // can left_type (source) be cast into right_type
  6367.     {
  6368.         ReportSemError(SemanticError::INVALID_INSTANCEOF_CONVERSION,
  6369.                        expr -> LeftToken(),
  6370.                        expr -> RightToken(),
  6371.                        left_type -> ContainingPackage() -> PackageName(),
  6372.                        left_type -> ExternalName(),
  6373.                        right_type -> ContainingPackage() -> PackageName(),
  6374.                        right_type -> ExternalName());
  6375.     }
  6376.  
  6377.     expr -> symbol = control.boolean_type;
  6378.  
  6379.     return;
  6380. }
  6381.  
  6382.  
  6383. void Semantic::ProcessBinaryExpression(Ast *expr)
  6384. {
  6385.     AstBinaryExpression *binary_expression = (AstBinaryExpression *) expr;
  6386.     (this ->* ProcessBinaryExpr[binary_expression -> binary_tag])(binary_expression);
  6387.  
  6388.     return;
  6389. }
  6390.  
  6391.  
  6392. void Semantic::ProcessTypeExpression(Ast *expr)
  6393. {
  6394.     AstTypeExpression *type_expression = (AstTypeExpression *) expr;
  6395.  
  6396.     AstArrayType *array_type = type_expression -> type -> ArrayTypeCast();
  6397.     Ast *actual_type = (array_type ? array_type -> type : type_expression -> type);
  6398.  
  6399.     AstPrimitiveType *primitive_type = actual_type -> PrimitiveTypeCast();
  6400.     TypeSymbol *type = (primitive_type ? FindPrimitiveType(primitive_type) : MustFindType(actual_type));
  6401.  
  6402.     if (array_type)
  6403.         type = type -> GetArrayType((Semantic *) this, array_type -> NumBrackets());
  6404.  
  6405.     type_expression -> symbol = type;
  6406.  
  6407.     return;
  6408. }
  6409.  
  6410.  
  6411. void Semantic::ProcessConditionalExpression(Ast *expr)
  6412. {
  6413.     AstConditionalExpression *conditional_expression = (AstConditionalExpression *) expr;
  6414.  
  6415.     ProcessExpression(conditional_expression -> test_expression);
  6416.     ProcessExpressionOrStringConstant(conditional_expression -> true_expression);
  6417.     ProcessExpressionOrStringConstant(conditional_expression -> false_expression);
  6418.  
  6419.     TypeSymbol *test_type  = conditional_expression -> test_expression -> Type();
  6420.     TypeSymbol *true_type  = conditional_expression -> true_expression -> Type();
  6421.     TypeSymbol *false_type = conditional_expression -> false_expression -> Type();
  6422.  
  6423.     if (test_type == control.no_type || true_type == control.no_type || false_type == control.no_type)
  6424.         conditional_expression -> symbol = control.no_type;
  6425.     else if (test_type != control.boolean_type)
  6426.     {
  6427.         ReportSemError(SemanticError::TYPE_NOT_BOOLEAN,
  6428.                        conditional_expression -> test_expression -> LeftToken(),
  6429.                        conditional_expression -> test_expression -> RightToken(),
  6430.                        conditional_expression -> test_expression -> Type() -> Name());
  6431.         conditional_expression -> symbol = control.no_type;
  6432.     }
  6433.     else if (true_type == control.void_type)
  6434.     {
  6435.         ReportSemError(SemanticError::TYPE_IS_VOID,
  6436.                        conditional_expression -> true_expression -> LeftToken(),
  6437.                        conditional_expression -> true_expression -> RightToken(),
  6438.                        conditional_expression -> true_expression -> Type() -> Name());
  6439.         conditional_expression -> symbol = control.no_type;
  6440.     }
  6441.     else if (false_type == control.void_type)
  6442.     {
  6443.         ReportSemError(SemanticError::TYPE_IS_VOID,
  6444.                        conditional_expression -> false_expression -> LeftToken(),
  6445.                        conditional_expression -> false_expression -> RightToken(),
  6446.                        conditional_expression -> false_expression -> Type() -> Name());
  6447.         conditional_expression -> symbol = control.no_type;
  6448.     }
  6449.     else if (true_type -> Primitive())
  6450.     {
  6451.         if (! false_type -> Primitive() ||
  6452.             (true_type != false_type && (true_type == control.boolean_type || false_type == control.boolean_type)))
  6453.         {
  6454.             ReportSemError(SemanticError::INCOMPATIBLE_TYPE_FOR_CONDITIONAL_EXPRESSION,
  6455.                            conditional_expression -> false_expression -> LeftToken(),
  6456.                            conditional_expression -> false_expression -> RightToken(),
  6457.                            conditional_expression -> false_expression -> Type() -> ContainingPackage() -> PackageName(),
  6458.                            conditional_expression -> false_expression -> Type() -> ExternalName(),
  6459.                            conditional_expression -> true_expression -> Type() -> ContainingPackage() -> PackageName(),
  6460.                            conditional_expression -> true_expression -> Type() -> ExternalName());
  6461.             conditional_expression -> symbol = control.no_type;
  6462.         }
  6463.         else // must be a numeric type
  6464.         {
  6465.             if (true_type == false_type)
  6466.                 conditional_expression -> symbol = true_type;
  6467.             else // must be a numeric type
  6468.             {
  6469.                 if (true_type == control.byte_type && false_type == control.short_type)
  6470.                 {
  6471.                     conditional_expression -> true_expression =
  6472.                                 ConvertToType(conditional_expression -> true_expression, control.short_type);
  6473.                     conditional_expression -> symbol = control.short_type;
  6474.                 }
  6475.                 else if (true_type == control.short_type && false_type == control.byte_type)
  6476.                 {
  6477.                     conditional_expression -> false_expression =
  6478.                         ConvertToType(conditional_expression -> false_expression, control.short_type);
  6479.                     conditional_expression -> symbol = control.short_type;
  6480.                 }
  6481.                 else if (IsIntValueRepresentableInType(conditional_expression -> false_expression, true_type))
  6482.                 {
  6483.                     conditional_expression -> false_expression =
  6484.                         ConvertToType(conditional_expression -> false_expression, true_type);
  6485.                     conditional_expression -> symbol = true_type;
  6486.                 }
  6487.                 else if (IsIntValueRepresentableInType(conditional_expression -> true_expression, false_type))
  6488.                 {
  6489.                     conditional_expression -> true_expression =
  6490.                          ConvertToType(conditional_expression -> true_expression, false_type);
  6491.                     conditional_expression -> symbol = false_type;
  6492.                 }
  6493.                 else BinaryNumericPromotion(conditional_expression);
  6494.             }
  6495.  
  6496.             //
  6497.             // If all the relevant subexpressions are constants, compute the results and
  6498.             // set the value of the expression accordingly.
  6499.             //
  6500.             if (conditional_expression -> test_expression -> IsConstant())
  6501.             {
  6502.                 IntLiteralValue *test = (IntLiteralValue *) conditional_expression -> test_expression -> value;
  6503.  
  6504.                 if (test -> value && conditional_expression -> true_expression -> IsConstant())
  6505.                      conditional_expression -> value = conditional_expression -> true_expression -> value;
  6506.                 else if ((! test -> value) && conditional_expression -> false_expression -> IsConstant())
  6507.                      conditional_expression -> value = conditional_expression -> false_expression -> value;
  6508.             }
  6509.         }
  6510.     }
  6511.     else
  6512.     {
  6513.         if (true_type == false_type)
  6514.             conditional_expression -> symbol = true_type;
  6515.         else if (false_type -> Primitive())
  6516.         {
  6517.             ReportSemError(SemanticError::INCOMPATIBLE_TYPE_FOR_CONDITIONAL_EXPRESSION,
  6518.                            conditional_expression -> false_expression -> LeftToken(),
  6519.                            conditional_expression -> false_expression -> RightToken(),
  6520.                            conditional_expression -> false_expression -> Type() -> ContainingPackage() -> PackageName(),
  6521.                            conditional_expression -> false_expression -> Type() -> ExternalName(),
  6522.                            conditional_expression -> true_expression -> Type() -> ContainingPackage() -> PackageName(),
  6523.                            conditional_expression -> true_expression -> Type() -> ExternalName());
  6524.             conditional_expression -> symbol = control.no_type;
  6525.         }
  6526.         else if (true_type == control.null_type)
  6527.             conditional_expression -> symbol = false_type;
  6528.         else if (false_type == control.null_type)
  6529.             conditional_expression -> symbol = true_type;
  6530.         else if (CanAssignmentConvert(false_type, conditional_expression -> true_expression))
  6531.         {
  6532.             conditional_expression -> true_expression = ConvertToType(conditional_expression -> true_expression, false_type);
  6533.             conditional_expression -> symbol = false_type;
  6534.         }
  6535.         else if (CanAssignmentConvert(true_type, conditional_expression -> false_expression))
  6536.         {
  6537.             conditional_expression -> false_expression = ConvertToType(conditional_expression -> false_expression, true_type);
  6538.             conditional_expression -> symbol = true_type;
  6539.         }
  6540.         else
  6541.         {
  6542.             ReportSemError(SemanticError::INCOMPATIBLE_TYPE_FOR_CONDITIONAL_EXPRESSION,
  6543.                            conditional_expression -> false_expression -> LeftToken(),
  6544.                            conditional_expression -> false_expression -> RightToken(),
  6545.                            conditional_expression -> false_expression -> Type() -> ContainingPackage() -> PackageName(),
  6546.                            conditional_expression -> false_expression -> Type() -> ExternalName(),
  6547.                            conditional_expression -> true_expression -> Type() -> ContainingPackage() -> PackageName(),
  6548.                            conditional_expression -> true_expression -> Type() -> ExternalName());
  6549.             conditional_expression -> symbol = control.no_type;
  6550.         }
  6551.     }
  6552.  
  6553.     return;
  6554. }
  6555.  
  6556.  
  6557. void Semantic::ProcessAssignmentExpression(Ast *expr)
  6558. {
  6559.     AstAssignmentExpression *assignment_expression = (AstAssignmentExpression *) expr;
  6560.  
  6561.     AstExpression *left_hand_side = assignment_expression -> left_hand_side;
  6562.  
  6563.     ProcessExpression(left_hand_side);
  6564.     ProcessExpressionOrStringConstant(assignment_expression -> expression);
  6565.     TypeSymbol *left_type = left_hand_side -> Type(),
  6566.                *right_type = assignment_expression -> expression -> Type();
  6567.  
  6568.     assignment_expression -> symbol = left_type;
  6569.  
  6570.     if (left_type == control.no_type || right_type == control.no_type)
  6571.         return;
  6572.  
  6573.     if (left_hand_side -> ArrayAccessCast())
  6574.     {
  6575.         //
  6576.         // This operation may throw ArrayStoreException
  6577.         //
  6578.         SymbolSet *exception_set = TryExceptionTableStack().Top();
  6579.         if (exception_set && (! left_type -> Primitive()))
  6580.         {
  6581.             exception_set -> AddElement(control.RuntimeException());
  6582.             exception_set -> AddElement(control.Error());
  6583.         }
  6584.     }
  6585.     else // the left-hand-side is a name
  6586.     {
  6587.         MethodSymbol *read_method = NULL;
  6588.         AstSimpleName *simple_name = left_hand_side -> SimpleNameCast();
  6589.         if (simple_name)
  6590.         {
  6591.             if (simple_name -> resolution_opt)
  6592.                read_method = simple_name -> resolution_opt -> symbol -> MethodCast();
  6593.         }
  6594.         else
  6595.         {
  6596.             AstFieldAccess *field_access = (AstFieldAccess *) left_hand_side;
  6597.             if (field_access -> resolution_opt)
  6598.                 read_method = field_access -> resolution_opt -> symbol -> MethodCast();
  6599.         }
  6600.  
  6601.         if (read_method)
  6602.         {
  6603.             VariableSymbol *symbol = (VariableSymbol *) read_method -> accessed_member;
  6604.             assignment_expression -> write_method = TypeSymbol::GetWriteAccessMethod(symbol);
  6605.         }
  6606.     }
  6607.  
  6608.     if (assignment_expression -> assignment_tag == AstAssignmentExpression::EQUAL)
  6609.     {
  6610.         if (left_type != right_type)
  6611.         {
  6612.             if (CanAssignmentConvert(left_type, assignment_expression -> expression))
  6613.                 assignment_expression -> expression = ConvertToType(assignment_expression -> expression, left_type);
  6614.             else if (assignment_expression -> expression -> IsConstant() &&
  6615.                      control.IsSimpleIntegerValueType(assignment_expression -> expression -> Type()))
  6616.             {
  6617.                 if (left_type == control.byte_type)
  6618.                      ReportSemError(SemanticError::INVALID_BYTE_VALUE,
  6619.                                     assignment_expression -> expression -> LeftToken(),
  6620.                                     assignment_expression -> expression -> RightToken());
  6621.                 else if (left_type == control.char_type)
  6622.                      ReportSemError(SemanticError::INVALID_CHARACTER_VALUE,
  6623.                                     assignment_expression -> expression -> LeftToken(),
  6624.                                     assignment_expression -> expression -> RightToken());
  6625.                 else ReportSemError(SemanticError::INVALID_SHORT_VALUE,
  6626.                                     assignment_expression -> expression -> LeftToken(),
  6627.                                     assignment_expression -> expression -> RightToken());
  6628.             }
  6629.             else
  6630.             {
  6631.                 ReportSemError(SemanticError::INCOMPATIBLE_TYPE_FOR_ASSIGNMENT,
  6632.                                assignment_expression -> LeftToken(),
  6633.                                assignment_expression -> RightToken(),
  6634.                                left_type -> ContainingPackage() -> PackageName(),
  6635.                                left_type -> ExternalName(),
  6636.                                right_type -> ContainingPackage() -> PackageName(),
  6637.                                right_type -> ExternalName());
  6638.             }
  6639.         }
  6640.  
  6641.         return;
  6642.     }
  6643.  
  6644.     //
  6645.     // In the current spec, it is stated that the type of both the left-hand
  6646.     // and right-hand side of an "op=" assignment must be primitive. However,
  6647.     // the left-hand side may be of type String if the operator is "+=" and
  6648.     // that case, the right-hand side may also be of type String (or anything
  6649.     // else).
  6650.     //
  6651.     // TODO: CONFIRM THAT THERE WAS A MISTAKE IN THE SPEC.
  6652.     //
  6653.     if (left_type == control.String() && assignment_expression -> assignment_tag == AstAssignmentExpression::PLUS_EQUAL)
  6654.     {
  6655.         if (right_type != control.String())
  6656.         {
  6657.             if (right_type == control.void_type)
  6658.                 ReportSemError(SemanticError::VOID_TO_STRING,
  6659.                                assignment_expression -> expression -> LeftToken(),
  6660.                                assignment_expression -> expression -> RightToken());
  6661.             assignment_expression -> expression = ConvertToType(assignment_expression -> expression, control.String());
  6662.         }
  6663.  
  6664.         return;
  6665.     }
  6666.  
  6667.     if (! left_type -> Primitive())
  6668.     {
  6669.         ReportSemError(SemanticError::TYPE_NOT_PRIMITIVE,
  6670.                        left_hand_side -> LeftToken(),
  6671.                        left_hand_side -> RightToken(),
  6672.                        left_type -> Name());
  6673.         return;
  6674.     }
  6675.  
  6676.     if (! right_type -> Primitive())
  6677.     {
  6678.         ReportSemError(SemanticError::TYPE_NOT_PRIMITIVE,
  6679.                        assignment_expression -> expression -> LeftToken(),
  6680.                        assignment_expression -> expression -> RightToken(),
  6681.                        right_type -> Name());
  6682.         return;
  6683.     }
  6684.  
  6685.     switch(assignment_expression -> assignment_tag)
  6686.     {
  6687.         case AstAssignmentExpression::PLUS_EQUAL:
  6688.         case AstAssignmentExpression::STAR_EQUAL:
  6689.         case AstAssignmentExpression::SLASH_EQUAL:
  6690.         case AstAssignmentExpression::MOD_EQUAL:
  6691.         case AstAssignmentExpression::MINUS_EQUAL:
  6692.             BinaryNumericPromotion(assignment_expression);
  6693.             break;
  6694.         case AstAssignmentExpression::LEFT_SHIFT_EQUAL:
  6695.         case AstAssignmentExpression::RIGHT_SHIFT_EQUAL:
  6696.         case AstAssignmentExpression::UNSIGNED_RIGHT_SHIFT_EQUAL:
  6697.              if (! control.IsIntegral(left_type))
  6698.              {
  6699.                  ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  6700.                                 left_hand_side -> LeftToken(),
  6701.                                 left_hand_side -> RightToken(),
  6702.                                 left_type -> Name());
  6703.              }
  6704.  
  6705.              if (! control.IsIntegral(right_type))
  6706.              {
  6707.                  ReportSemError(SemanticError::TYPE_NOT_INTEGRAL,
  6708.                                 assignment_expression -> expression -> LeftToken(),
  6709.                                 assignment_expression -> expression -> RightToken(),
  6710.                                 right_type -> Name());
  6711.              }
  6712.  
  6713.              assignment_expression -> left_hand_side = PromoteUnaryNumericExpression(left_hand_side);
  6714.              assignment_expression -> expression = PromoteUnaryNumericExpression(assignment_expression -> expression);
  6715.              if (assignment_expression -> expression -> Type() == control.long_type)
  6716.                  assignment_expression -> expression = ConvertToType(assignment_expression -> expression, control.int_type);
  6717.              break;
  6718.         case AstAssignmentExpression::AND_EQUAL:
  6719.         case AstAssignmentExpression::XOR_EQUAL:
  6720.         case AstAssignmentExpression::IOR_EQUAL:
  6721.              if (left_type != control.boolean_type || right_type != control.boolean_type) // if anyont of the exprs is not boolean
  6722.                  BinaryNumericPromotion(assignment_expression);
  6723.              break;
  6724.         default:
  6725.             assert(0);
  6726.             break;
  6727.     }
  6728.  
  6729.     return;
  6730. }
  6731.